当前位置: 首页 > article >正文

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;
    }
}


http://www.kler.cn/a/297502.html

相关文章:

  • Gin-封装自动路由
  • 计算机毕业设计Pyhive+Spark招聘可视化 职位薪资预测 招聘推荐系统 招聘大数据 招聘爬虫 大数据毕业设计 Hadoop Scrapy
  • 数学建模笔记—— 线性规划
  • Chapter 11 脚手架Vue CLI使用步骤
  • PyTorch维度操作的函数介绍
  • linux高级学习12
  • 运维学习————Zabbix监控框架(1)
  • 高级算法设计与分析 学习笔记3 哈希表
  • LaTeX中算法环境横线/宽度调整(Algorithm)
  • 收银系统源码-收银台(exe、apk安装包)自由灵活操作简单!
  • 【阿雄不会写代码】全国职业院校技能大赛GZ036第五套
  • HTTP1.0 到 HTTP3.0 的优化
  • 【网络安全 | 渗透工具】IIS 短文件名枚举工具—shortscan安装使用教程
  • @Transactional 参数详解
  • Charles - 夜神模拟器证书安装App抓包-charles监控手机出现unknown 已解决
  • 子网ip和ip地址一样吗?子网ip地址怎么算
  • Google AI 概述——喜欢的三点和不喜欢的两点
  • 使用Python海龟绘图画出奥运五环图
  • Android消息类型及事件分发流程
  • 99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)