LeetCode关于Interval的问题

关于我的 Leetcode 题目解答,代码前往 Github:https://github.com/chenxiangcyr/leetcode-answers


LeetCode题目:56. Merge Intervals
Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
class Solution {
    public List<Interval> merge(List<Interval> intervals) {
        
        // sort based on start time
        Collections.sort(intervals, new Comparator<Interval>() {
            public int compare(Interval i1, Interval i2) {
                return i1.start - i2.start;
            }
        });
        
        LinkedList<Interval> result = new LinkedList<Interval>();
        
        
        for(Interval interval : intervals) {
            if(result.isEmpty() || result.getLast().end < interval.start) {
                result.add(interval);
            }
            else {
                result.getLast().end = Math.max(result.getLast().end, interval.end);
            }
        }
        
        return result;
    }
}

LeetCode题目:57. Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        
        // the intervals were initially sorted according to their start times
        Iterator<Interval> itr = intervals.iterator();
        
        int originalSize = intervals.size();
        
        int idx = 0;
        while(itr.hasNext()) {
            Interval curInterval = itr.next();
            
            if(newInterval.end < curInterval.start) {
                break;
            }
            
            // merge if overlap
            if(isOverlapped(curInterval, newInterval)) {
                newInterval = mergeOverlapped(curInterval, newInterval);
                itr.remove();
            }
            
            idx++;
        }
        
        
        int newSize = intervals.size();
        
        int diff = originalSize - newSize;
        
        intervals.add(idx - diff, newInterval);
        
        
        return intervals;
    }
    
    public boolean isOverlapped(Interval i1, Interval i2) {
        
        if(i1.start <= i2.end && i2.start <= i1.end) {
            return true;
        }
        
        return false;
    }
    
    public Interval mergeOverlapped(Interval i1, Interval i2) {
        return new Interval(
            Math.min(i1.start, i2.start), 
            Math.max(i1.end, i2.end)
        );
    }
}

LeetCode题目:715. Range Module
A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner.

  • addRange(int left, int right) Adds the half-open interval [left, right), tracking every real number in that interval. Adding an interval that partially overlaps with currently tracked numbers should add any numbers in the interval [left, right) that are not already tracked.
  • queryRange(int left, int right) Returns true if and only if every real number in the interval [left, right) is currently being tracked.
  • removeRange(int left, int right) Stops tracking every real number currently being tracked in the interval [left, right).

Example 1:
addRange(10, 20): null
removeRange(14, 16): null
queryRange(10, 14): true (Every number in [10, 14) is being tracked)
queryRange(13, 15): false (Numbers like 14, 14.03, 14.17 in [13, 15) are not being tracked)
queryRange(16, 17): true (The number 16 in [16, 17) is still being tracked, despite the remove operation)

Note:

  • A half open interval [left, right) denotes all real numbers left <= x < right.
  • 0 < left < right < 10^9 in all calls to addRange, queryRange, removeRange.
  • The total number of calls to addRange in a single test case is at most 1000.
  • The total number of calls to queryRange in a single test case is at most 5000.
  • The total number of calls to removeRange in a single test case is at most 1000.

具体思路参见 https://leetcode.com/articles/range-module/
关于 TreeSet,参见 红黑树的Java实现TreeSet及相关LeetCode题目

class RangeModule {
    class Interval implements Comparable<Interval> {
        int left;
        int right;

        public Interval(int left, int right){
            this.left = left;
            this.right = right;
        }

        public int compareTo(Interval that){
            if (this.right == that.right) return this.left - that.left;

            return this.right - that.right;
        }
    }
    
    TreeSet<Interval> ranges;
    
    public RangeModule() {
        ranges = new TreeSet<Interval>();
    }
    
    public void addRange(int left, int right) {
        // tailSet: Returns a view of the portion of this set whose elements are greater than or equal to fromElement.
        Iterator<Interval> itr = ranges.tailSet(new Interval(0, left - 1)).iterator();
        
        while (itr.hasNext()) {
            Interval iv = itr.next();
            if (right < iv.left) break;
            left = Math.min(left, iv.left);
            right = Math.max(right, iv.right);
            itr.remove();
        }
        
        ranges.add(new Interval(left, right));
    }
    
    public void removeRange(int left, int right) {
        // tailSet: Returns a view of the portion of this set whose elements are greater than or equal to fromElement.
        Iterator<Interval> itr = ranges.tailSet(new Interval(0, left)).iterator();
        
        ArrayList<Interval> todo = new ArrayList();
        
        while (itr.hasNext()) {
            Interval iv = itr.next();
            if (right < iv.left) break;
            
            if (iv.left < left) todo.add(new Interval(iv.left, left));
            if (right < iv.right) todo.add(new Interval(right, iv.right));
            
            itr.remove();
        }
        
        for (Interval iv: todo) ranges.add(iv);
    }
    
    public boolean queryRange(int left, int right) {
        Interval in = ranges.higher(new Interval(0, left));
        
        if(in != null && in.left <= left && in.right >= right) {
            return true;
        }
        
        return false;
    }
}

/**
 * Your RangeModule object will be instantiated and called as such:
 * RangeModule obj = new RangeModule();
 * obj.addRange(left,right);
 * boolean param_2 = obj.queryRange(left,right);
 * obj.removeRange(left,right);
 */

LeetCode题目:616. Add Bold Tag in String
iven a string s and a list of strings dict, you need to add a closed pair of bold tag <b> and </b> to wrap the substrings in s that exist in dict. If two such substrings overlap, you need to wrap them together by only one pair of closed bold tag. Also, if two substrings wrapped by bold tags are consecutive, you need to combine them.

Example 1:
Input:
s = "abcxyz123"
dict = ["abc","123"]
Output:
"<b>abc</b>xyz<b>123</b>"

Example 2:
Input:
s = "aaabbcc"
dict = ["aaa","aab","bc"]
Output:
"<b>aaabbc</b>c"

Note:

  • The given dict won't contain duplicates, and its length won't exceed 100.
  • All the strings in input have length in range [1, 1000].
class Solution {
    public String addBoldTag(String s, String[] dict) {
        List<Interval> tags = new ArrayList<>();
        
        if(s.isEmpty()) return s;
        
        for(String word : dict) {
            int wordLength = word.length();
            
            for(int i = 0; i <= s.length() - wordLength; i++) {
                String subString = s.substring(i, i + wordLength);
                
                if(subString.equals(word)) {
                    tags.add(new Interval(i, i + wordLength - 1));
                }
            }
        }
        
        tags = merge(tags);
        
        StringBuilder sb = new StringBuilder(s);
        int count = 0;
        for(Interval i : tags) {
            System.out.println(i.left + ":" + i.right);
            
            sb.insert(count * 7 + i.left, "<b>");
            sb.insert(count * 7 + 3 + i.right + 1, "</b>");
            
            count++;
        }
        
        return sb.toString();
    }
    
    class Interval {
        int left;
        int right;
        
        Interval() { left = 0; left = 0; }
        Interval(int s, int e) { left = s; right = e; }
    }
    
    public List<Interval> merge(List<Interval> intervals) {
        
        // sort based on start time
        Collections.sort(intervals, new Comparator<Interval>() {
            public int compare(Interval i1, Interval i2) {
                return i1.left - i2.left;
            }
        });
        
        LinkedList<Interval> result = new LinkedList<Interval>();
        
        
        for(Interval interval : intervals) {
            if(result.isEmpty() || result.getLast().right < (interval.left - 1)) {
                result.add(interval);
            }
            else {
                result.getLast().right = Math.max(result.getLast().right, interval.right);
            }
        }
        
        return result;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,096评论 0 10
  • 夜已深,窗外的雨带着秋意徐徐,空气氤氲,刺激着我们灵敏的下丘脑体温调节中枢。 明天是帮班,挺好的,以前不爱,现在却...
    鱼儿的匆匆阅读 276评论 2 41
  • - 欢迎关注http://quanke.name/ - 转载请注明出处,谢谢 为了体验windows10,花了我一...
    全科阅读 239评论 0 2
  • 天津今天下起来了雪,2018年的第一场雪吧,寥寥雪花。坐在客厅电脑桌前的我又再计算着凡夫人的帐。还有不到一个月过...
    海静_e9c3阅读 232评论 0 0
  • 蚂蚁们要的很少 他们偷吃了我的苹果、红枣 我对一切都开始存怀疑态度 星期日上街买了几斤蛋挞 啃一个丢一点蛋屑下去 ...
    隔着玻璃亲嘴阅读 505评论 0 0