【问题描述】56.合并区间

给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

【解答思路】

1. 双指针

左边位置一定是确定,就是 a[0],而右边位置是 max(a[1], b[1])
时间复杂度:O(N) 空间复杂度:O(1)

 public int[][] merge(int[][] intervals) {List<int[]> res = new ArrayList<>();if (intervals == null || intervals.length == 0)return res.toArray(new int[0][]);// Arrays.sort(intervals, (a, b) -> a[0] - b[0]);// a[0] - b[0]大于0就交换顺序// 根据二维数组第一个数字大小按每一行整体排序Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {// TODO Auto-generated method stubreturn o1[0] - o2[0];}});int i = 0;while (i < intervals.length) {int left = intervals[i][0];int right = intervals[i][1];// i不能到最后一行,所以要小于(数组的长度 - 1)// 判断所在行的right和下一行的left大小,对right重新进行赋最大值,之后再不断进行while循环判断while (i < intervals.length - 1 && right >= intervals[i + 1][0]) {i++;right = Math.max(right, intervals[i][1]);}res.add(new int[] { left, right });i++;}return res.toArray(new int[0][]);}
2. 栈思想(威威)
  • 如果当前遍历到的区间的左端点 > 结果集中最后一个区间的右端点,说明它们没有交集,此时把区间添加到结果集;
  • 如果当前遍历到的区间的左端点 <= 结果集中最后一个区间的右端点,说明它们有交集,此时产生合并操作,即:对结果集中最后一个区间的右端点更新(取两个区间的最大值)。
    时间复杂度:O(N) 空间复杂度:O(1)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Stack;public class Solution {public int[][] merge(int[][] intervals) {int len = intervals.length;if (len < 2) {return intervals;}// 按照起点排序Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));// 也可以使用 Stack,因为我们只关心结果集的最后一个区间List<int[]> res = new ArrayList<>();res.add(intervals[0]);for (int i = 1; i < len; i++) {int[] curInterval = intervals[i];// 每次新遍历到的列表与当前结果集中的最后一个区间的末尾端点进行比较int[] peek = res.get(res.size() - 1);if (curInterval[0] > peek[1]) {res.add(curInterval);} else {// 注意,这里应该取最大peek[1] = Math.max(curInterval[1], peek[1]);}}return res.toArray(new int[res.size()][]);}public static void main(String[] args) {Solution solution = new Solution();int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};int[][] res = solution.merge(intervals);for (int i = 0; i < res.length; i++) {System.out.println(Arrays.toString(res[i]));}}
}

【总结】

1. Java 数组题 转化 List
List<int[]> res = new ArrayList<>();
res.add(new int[] { left, right });
res.toArray(new int[0][]);
2. Java中Arrays.sort()的几种用法
  • Arrays.sort(int[] a) 对一个数组的所有元素进行排序,并且是按从小到大的顺序
  • Arrays.sort(int[] a, int fromIndex, int toIndex) 对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序
  • public static void sort(T[] a,int fromIndex, int toIndex, Comparator<? super T> c) Comparator类型的参数
   Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {// TODO Auto-generated method stubreturn o1[0] - o2[0];}});
  1. 区间类的问题,一般而言是需要画图思考的。
  • 和物理现象相关的
  • 本身问题描述就和图形相关的问题
  • 链表问题
  • 回溯算法问题
  • 动态规划问题
  1. 贪心算法
  • 贪心算法(Greedy Algorithm)是指:在对问题求解时,总是做出在当前看来是最好的选择。也就是不从整体最优上加以考虑,贪心算法所做出决策是在某种意义上的局部最优解。
  • 可以适用贪心的问题就是每一步局部最优,最后导致结果全局最优。
  • 必须具备无后效性,,即某个状态以前的过程不会影响以后的状态,只与当前状态有关
  • 由于贪心算法适用的场景一般都是在一组决策里选择最大或者最小值,因此常常在使用贪心算法之前,需要先对数据按照某种规则排序
  • 一旦贪心选择性质不成立,可以考虑的另一种算法思想就是「动态规划」。「动态规划」在每一步做决策的时候,就不只考虑当前步骤的最优解。
  • 贪心算法应用
    • 对数据压缩编码的霍夫曼编码(Huffman Coding)
    • 求最小生成树的 Prim 算法和 Kruskal 算法
    • 求单源最短路径的Dijkstra算法

[Leedcode][JAVA][第56题][合并区间][数组][贪心算法]相关推荐

  1. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  2. 《LeetCode力扣练习》第56题 合并区间 Java

    <LeetCode力扣练习>第56题 合并区间 Java 一.资源 题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, ...

  3. [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]

    [问题描述][简单] 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1-&g ...

  4. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  5. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  6. [剑指offer]面试题第[42]题[Leedcode][JAVA][第53题][最大子序和][动态规划][贪心][分治]

    [问题描述][第53题][最大子序和][中等] 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和.示例:输入: [-2,1,-3,4,-1,2,1, ...

  7. [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]

    [问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...

  8. [Leedcode][JAVA]第[945]题

    [问题描述] 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1.返回使 A 中的每个值都是唯一的最少操作次数.示例 1:输入:[1,2,2] 输出:1 解释:经过一次 mo ...

  9. 2022-4-11 Leetcode 435.无重叠区间 —— 【贪心算法】

    第一版,我本来打算是按照会议室的方式写的.每个房间放入连续的数组下标的序号.后来发现可能会出现同一个数组能够放入多个房间里,所以需要在每一轮开始前对房间进行排序. 本来自信慢慢的觉得自己能过,但是发现 ...

最新文章

  1. SAP Hybris使用recipe进行安装时,是如何执行ant命令的?
  2. SpringMvc接口中转设计(策略+模板方法)
  3. python 中的if else 和in
  4. linux设置开机启动 服务不支持chkconfig解决方法脚本
  5. malware analysis、Sandbox Principles、Design Implementation
  6. java性能优化权威指南_《Java性能优化权威指南》PDF 下载
  7. 戴尔计算机没有硬盘驱动,如果Dell计算机无法从硬盘驱动器启动怎么办
  8. VSCode 中文乱码设置
  9. linux的桌面分辨率设置,linux xorg屏幕分辨率设置
  10. 谷歌地球 最新hosts_给我一个Google地球app,可以领略全球3D风情
  11. PHP 生成PDF文件并向PDF添加图片
  12. 奥斯卡大乌龙,然而人工智能也预测《爱乐之城》为最佳影片
  13. 【补充习题七】积分不等式及定积分性质
  14. Web前端-vue 开发命名规范
  15. XC3101锂电池充电IC(耐高压,带OVP)
  16. linux arm fpu初始化,如何确定Linux主板是否使用硬件FPU?
  17. S7-200SMART案例分析——运动控制编程(三)
  18. js获取当前月、上一月和下一月
  19. 网关是什么,一文带你快速入门腾讯技术工程
  20. 使用jQuery的ajax的方法完成一个手机归属地查询

热门文章

  1. Eclips将lib打入war中
  2. 广州技术沙龙第 2、3 期参会者twitter、blog、兴趣大合集
  3. springcloud gateway 使用nacos 作为配置中心 和 注册中心
  4. 网站三级分销数据库如何设计,简单案例
  5. 定时任务 Scheduled quartz
  6. Oracle - 新装数据库、新建用户注意事项
  7. SQLite shell操作
  8. Java成神之路技术整理(长期更新)
  9. android手机deviceowner,删除 androidDeviceOwnerWiFiConfiguration
  10. 【算法设计与分析】07 算法的数学基础