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.length; i++) {
            if (intervals[i][0] >= 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<Integer> partitionLabels(String s) {
        LinkedList<Integer> 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<int[]> 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()][]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值