leetcode刷题|贪心 无重叠区间 划分字母区间 合并区间

435.无重叠区间

力扣链接

题解

解题思路

  • 按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。

Java代码

 
  
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        //按照左边界升序排序 右边界排序 a[1],b[1]
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        //记录不重叠的count
        int count = 1;
        for (int i=1; i = intervals[i-1][1]) { //i和i-1不挨着
                count++;
            } else {
                //i和i-1挨着
                intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]);
            }
        }
        return intervals.length - count;
    }
}

763.划分字母区间

力扣链接

题解

解题思路

  • 统计每一个字符最后出现的位置

  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

Java代码

 
  
class Solution {
    public List partitionLabels(String s) {
        LinkedList res = new LinkedList<>();

        if (s.length() == 1) {
            res.add(1);
            return res;
        }

        char[] ch = s.toCharArray();
        int[] edge = new int[26];
        
        //记录字母最后出现的位置 ch[i] - a是字符转int,同一字符的值会一直被i更新
        for (int i = 0; i < ch.length; i++) {
            edge[ch[i] - 'a'] = i;  
        }
        int left =0;
        int right =0;
        for (int i = 0; i < ch.length; i++) {
            right = Math.max(right, edge[ch[i] - 'a']);
            //字符最远出现位置下标和当前下标相等
            if (right == i) {
                res.add(right - left + 1);
                left = i+1;
            }
        }
        return res;
    }
}

56.合并区间

力扣链接

题解

解题思路

  • 其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。

Java代码

 
  
class Solution {
    public int[][] merge(int[][] intervals) {
        List res = new ArrayList<>();
        Arrays.sort(intervals, (a,b)-> Integer.compare(a[0], b[0]));
      
        int start = intervals[0][0];
        int rightRange = intervals[0][1];
        for (int i = 1; i < intervals.length; i++) {
            //i与i-1不挨着 加入区间并更新start
            if (intervals[i][0] > rightRange) {
                res.add(new int[]{start, rightRange});
                start = intervals[i][0];
                rightRange = intervals[i][1];
            } else {
                rightRange = Math.max(rightRange, intervals[i][1]);
            }
        }
        res.add(new int[]{start, rightRange});
        return res.toArray(new int[res.size()][]);
    }
}

你可能感兴趣的:(leetcode,算法)