LeetCode之区间

228. 汇总区间

class Solution {
    public List<String> summaryRanges(int[] nums) {

        // 输入:nums = [0,1,2,4,5,7] 输出:["0->2","4->5","7"]
        // 创建一个字符串列表,用于存储结果
        List<String> result = new ArrayList<>();
        // 初始化索引i
        int i = 0;

        // 当索引i小于数组长度时,继续循环
        while (i < nums.length) {
            // 记录当前范围的起始索引
            int low = i;
            // 移动到下一个索引
            i++;

            // 检查是否还在连续范围内,nums[i]是否等于前一个数加1
            while (i < nums.length && nums[i] == nums[i - 1] + 1) {
                // 如果是连续的,移动到下一个索引
                i++;
            }

            // 记录当前范围的结束索引
            int high = i - 1;

            // 创建一个字符串缓冲区,存储起始数 
            StringBuilder sb = new StringBuilder(Integer.toString(nums[low]));

            // 如果起始索引低于结束索引,说明是一个范围
            if (low < high) {
                // 添加范围符号
                sb.append("->");
                // 添加结束数
                sb.append(Integer.toString(nums[high]));
            }
            // 将生成的范围或单个数添加到结果列表中
            result.add(sb.toString());
        }
        // 返回结果列表
        return result;
    }

}

56. 合并区间

class Solution {
    public int[][] merge(int[][] intervals) {
        // 按照区间的左边界进行升序排序
        Arrays.sort(intervals, (a, b) -> {
            return a[0] - b[0];
        });

        // 创建一个列表用于存储合并后的区间
        List<int[]> merge = new ArrayList<>();

        // 遍历排序后的区间数组
        for (int i = 0; i < intervals.length; i++) {
            // 获取当前区间的左边界
            int left = intervals[i][0];
            // 获取当前区间的右边界
            int right = intervals[i][1];

            // 如果合并列表为空或者当前区间的左边界大于合并列表中最后一个区间的右边界
            // 说明当前区间与之前的区间不重叠,可以直接添加到合并列表中
            if (merge.size() == 0 || merge.get(merge.size() - 1)[1] < left) {
                merge.add(new int[]{left, right});
            } else {
                // 如果当前区间与合并列表中最后一个区间有重叠
                // 则更新合并列表中最后一个区间的右边界为当前区间和合并列表中最后一个区间右边界的较大值
                merge.get(merge.size() - 1)[1] = Math.max(right, merge.get(merge.size() - 1)[1]);
            }
        }

        return merge.toArray(new int[merge.size()][1]);
    }
}

57. 插入区间

class Solution {

    public int[][] insert(int[][] intervals, int[] newInterval) {
        // 新插入区间的左边界
        int left = newInterval[0];
        // 新插入区间的右边界
        int right = newInterval[1];

        // 创建一个列表用于存储最终结果
        List<int[]> ansList = new ArrayList<>();

        // 标记新区间是否已被放置
        boolean placed = false;

        // 遍历给定的区间列表
        for (int[] interval : intervals) {
            // 如果当前区间在新插入区间的右侧且无交集
            if (interval[0] > right) {
                // 如果新区间还未被放置,将新区间加入结果列表
                if (!placed) {
                    ansList.add(new int[]{left, right});
                    placed = true;
                }
                // 将当前区间加入结果列表
                ansList.add(interval);
            } else if (interval[1] < left) {
                // 如果当前区间在新插入区间的左侧且无交集,直接将当前区间加入结果列表
                ansList.add(interval);
            } else {
                // 如果当前区间与新插入区间有交集,计算它们的并集
                left = Math.min(interval[0], left);
                right = Math.max(interval[1], right);
            }
        }

        // 如果遍历完所有区间后新区间仍未被放置,将新区间加入结果列表
        if (!placed) {
            ansList.add(new int[]{left, right});
        }

        // 将列表转换为二维数组作为最终结果
        int[][] result = new int[ansList.size()][2];
        for (int i = 0; i < ansList.size(); i++) {
            result[i] = ansList.get(i);
        }
        return result;
    }
}

452. 用最少数量的箭引爆气球

class Solution {
    public int findMinArrowShots(int[][] points) {
        // 对二维数组 points 按照每个区间的右边界进行升序排序
        Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));
        // 初始化第一个区间的右边界为 pre,初始最小箭的数量为 1
        int pre = points[0][1];
        int ans = 1;
        // 遍历所有区间
        for (int[] point : points) {
            // 如果当前区间的左边界大于上一个区间的右边界
            if (point[0] > pre) {
                // 更新 pre 为当前区间的右边界
                pre = point[1];
                // 箭的数量加一
                ans++;
            }
        }
        // 返回最小需要的箭的数量
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值