汇总区间-合并区间-插入区间(力扣)

 区间的一些问题。

//合并区间
class Solution {
    public int[][] merge(int[][] intervals) {
    //首先定义一个数组,用于存放最后的结果
    ArrayList<int[]> res = new ArrayList<>();
    //进行判断,如果长度小于2或者为空,返回本身
    if(intervals==null || intervals.length<2)return intervals;
    //进行排序操作
    Arrays.sort(intervals,(a,b)->a[0]-b[0]);
    //使用循环进行遍历操作
    for(int[] interval : intervals){
        //进行主要的判断 如果当前的数组为空,就将第一个元素进行加入操作 如果后一个数组的第一个元素大于前一个数组的第二个元素 也进行加入操作
        if(res.size()==0||interval[0]>res.get(res.size()-1)[1]){
            res.add(interval);
           }
        //否则 进行区间合并的操作        
        else{
            res.get(res.size()-1)[1]=Math.max(res.get(res.size()-1)[1],interval[1]);
       }
    
    }
    return res.toArray(new int[res.size()][2]);//转换为最后的结果
    }
}

class Solution {
    public List<String> summaryRanges(int[] nums) {
       //定义一个数组
       ArrayList<String> res = new ArrayList<>();
       //本题最主要的思想是nums[i]+1==nums[i+1]
       for(int i=0;i<nums.length;i++){
            int start = i;
            //使用while循环进行跳步操作
            while(start<nums.length-1 && nums[start]+1==nums[start+1]) start++;
            if(start==i) res.add(String.valueOf(nums[i]));
            else{
                res.add(nums[i]+"->"+nums[start]);
                }
        //进行一个赋值操作,向后走start步
        i = start;
        }
        return res;

        }
}

插入区间的操作类似于上述的合并区间的操作。不同之处在于有一个新的数组要进行添加进去。添加这个新数组的代码如下:

public int[][] insert(int[][] intervals, int[] newInterval) {
    //首先 定义一个新的数组 比原来的长度长一个
    int[][] newIntervals = new int[intervals.length+1][2];
    for(int i=0;i<intervals.length;i++){
            newIntervals[i] = intervals[i];
            }
     newIntervals[intervals.length]=newInterval;
}

之后的代码类似于汇总区间的代码:

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int[][] newIntervals = new int[intervals.length + 1][2];
        // 复制原始数组的元素
        for (int i = 0; i < intervals.length; i++) {
            newIntervals[i] = intervals[i];
        }
        // 插入新的区间
        newIntervals[intervals.length] = newInterval;
        ArrayList<int[]> res = new ArrayList<>();
        if(newIntervals == null || newIntervals.length<2) return newIntervals;
        Arrays.sort(newIntervals,(a,b)->a[0]-b[0]);
        for(int[] interval : newIntervals){
            if(res.size()==0 || interval[0]>res.get(res.size()-1)[1]) res.add(interval);
            else res.get(res.size()-1)[1] = Math.max(res.get(res.size()-1)[1],interval[1]);
        }
        return res.toArray(new int[res.size()][2]);
    }
}

用最少的箭射爆气球

这题的思路大致就是求一个交集,之前的思路都是求一个并集

class Solution {
    public int findMinArrowShots(int[][] points) {
        if(points==null || points.length<2)return 1;
        //对points数组进行排序操作 可以更好的进行操作
        Arrays.sort(points,(a,b)->Integer.compare(a[1],b[1]));
        //定义箭的个数
        int arrow = 1;
        //定义一个数组 记录points数组的第一位
        int[] cur = points[0];
        //进行for循环遍历操作
        for(int i=1;i<points.length;i++){
                if(points[i][0]>cur[1]){//比较后一个数组第一位是否大于前一个数组的第二位 成功 则箭加一
                        arrow++;
                        cur = points[i];//向后移动
                    }
            }
        return arrow;
    }
}
Arrays.sort(newIntervals,(a,b)->a[0]-b[0]);

 输入 [[-2147483646, -2147483645], [2147483646, 2147483647]] 会产生错误,这是因为在 Arrays.sort(points, (a, b) -> a[0] - b[0]) 这行代码中,当两个整数之间的差值超出 int 类型的范围时,会发生整数溢出。

Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));

使用这个调整的代码即可解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值