原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连。
回复进群即可加入和200+人一起打卡。上周打卡:
LeetCode 47全排列Ⅱ&48旋转图像
LeetCode 49字母异位词分组&50pow(x,n)&51八皇后
昨日打卡:LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩阵

跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

分析
这题我们可以使用一个O(n)的方法,和前面一些题的方法也很相似,遍历这个数组,遍历的同时用一个index标记最大值。如果可以更新最大值那么就更新,如果index比最大值还大,那就直接返回false。

可到达的:

不可到达的:

具体ac代码:

public boolean canJump(int[] nums) {boolean jud[]=new boolean[nums.length];int maxlen=nums[0];int index=0;while (index<nums.length) {if(index>maxlen)return false;if(index+nums[index]>maxlen){maxlen=index+nums[index];}else {index++;}}return true;}

合并区间

合并区间
给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。

分析

思路都是一个思路,先把数组进行排序(根据左侧数据),排完序的数组遍历从左往右记录left,right。

  • left,right初始为left=intervals[0][0],right=intervals[0][1]
  • 遍历的时候如果当前元素intervals[index][0]<right 那么将left,right添加到结果集中,重新赋值left,right初始为当前元素值。
  • 如果intervals[index][0]>right条件下,如果 intervals[index][1]>right那么更新right为intervals[index][1]继续,否则继续向下。

在代码实现上提供两个版本,一个使用List的,一个用数组复用空间,使用List:

public int[][] merge(int[][] intervals) {if(intervals.length==0)return new int[0][0];Arrays.sort(intervals,new Comparator<int []>() {//排序@Overridepublic int compare(int[] o1, int[] o2) {// TODO Auto-generated method stubreturn o1[0]-o2[0];}});List<Integer>list=new ArrayList<Integer>();int left=intervals[0][0],right=intervals[0][1];for(int i=1;i<intervals.length;i++){if(intervals[i][0]<=right){if(intervals[i][1]>right)right=intervals[i][1];}else {list.add(left);list.add(right);left=intervals[i][0];right=intervals[i][1];}}list.add(left);list.add(right);int val[][]=new int [list.size()/2][2];for(int i=0;i<list.size();i+=2){val[i/2][0]=list.get(i);val[i/2][1]=list.get(i+1);}return val;
}


而复用数组实现思路如下:

 public int[][] merge(int[][] intervals) {if(intervals.length==0)return new int[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 index=0;int left=intervals[0][0],right=intervals[0][1];for(int i=1;i<intervals.length;i++){if(intervals[i][0]<=right){if(intervals[i][1]>right)right=intervals[i][1];}else {intervals[index][0]=left;intervals[index][1]=right;index++;left=intervals[i][0];right=intervals[i][1];}}intervals[index][0]=left;intervals[index][1]=right;return Arrays.copyOf(intervals, index+1);
}

时间差不多6ms。

插入区间

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

注意:输入类型已在 2019 年 4 月 15 日更改。请重置为默认代码定义以获取新的方法签名。

和上一题的思想差不多,先排序是肯定的。只不过这里有一点变化:给一个新的数组区间插进来然后再进行合并,在处理上你可以每次遍历的时候和我们数组进行比较,但是那无疑是一个比较差的方法。所以在这里我先用二分定位到添加的那个区间在原数组中的位置,然后分两次遍历进行操作就可以啦

具体代码为:

public int[][] insert(int[][] intervals, int[] newInterval) {if(intervals.length==0){int val[][]= {{newInterval[0],newInterval[1]}};return val;}List<Integer>list=new ArrayList<Integer>();//二分找到位置int l=0,r=intervals.length-1;int index=0;while (l<r) {int mid=(l+r)/2;if(intervals[mid][0]==newInterval[0]){l=mid+1;r=mid-1;}else if(intervals[mid][0]<newInterval[0]){l=mid+1;}else {r=mid-1;}}index=l;int left=intervals[0][0],right=intervals[0][1];if(index==0) {left=newInterval[0];right=newInterval[1];}for(int i=0;i<index;i++){if(intervals[i][0]<=right){if(intervals[i][1]>right)right=intervals[i][1];}else {list.add(left);list.add(right);left=intervals[i][0];right=intervals[i][1];}}if(newInterval[0]<=right){if(newInterval[1]>right)right=newInterval[1];}else {list.add(left);list.add(right);left=newInterval[0];right=newInterval[1];}for(int i=index;i<intervals.length;i++){if(intervals[i][0]<=right){if(intervals[i][1]>right)right=intervals[i][1];}else {list.add(left);list.add(right);left=intervals[i][0];right=intervals[i][1];}}list.add(left);list.add(right);int val[][]=new int [list.size()/2][2];for(int i=0;i<list.size();i+=2){val[i/2][0]=list.get(i);val[i/2][1]=list.get(i+1);}return val;}

下周继续!持续更新ing。欢迎关注公众号:bigsai,一起打卡力扣。还给大家准备一些干货,一起进步!

LeetCode 55跳跃游戏56合并区间57插入区间相关推荐

  1. LeetCode—55.跳跃游戏(Jump Game)——分析及代码(C++)

    LeetCode-55.跳跃游戏[Jump Game]--分析及代码[C++] 一.题目 二.分析及代码 1. 贪心 (1)思路 (2)代码(简洁) (3)代码(高效) (4)结果 三.其他 一.题目 ...

  2. LeetCode 55. 跳跃游戏 中等难度

    55. 跳跃游戏 题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1:输入: [2,3,1,1, ...

  3. LeetCode 55. 跳跃游戏(贪心)

    1. 题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1:输入: [2,3,1,1,4] 输出: ...

  4. Java实现 LeetCode 55 跳跃游戏

    55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] ...

  5. LeetCode 55. 跳跃游戏

    ​​​​​​55. 跳跃游戏 题目描述: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个下标. 代码 ...

  6. 贪心法——LeetCode 55 跳跃游戏

    跳跃游戏 题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] ...

  7. 161. Leetcode 55. 跳跃游戏 (贪心算法-贪心区间)

    class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) == 1:return Truecover = 0i ...

  8. leetcode - 55. 跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...

  9. Leetcode 55.跳跃游戏 (每日一题 20210706)

    给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 .数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个下标.示例 1:输入:nums = [2,3,1,1,4] ...

最新文章

  1. 结队-结队编程项目贪吃蛇-项目进度
  2. namecheap教程
  3. VSS自动发布站点功能扩展
  4. 40岁了,还要跟小年青一样埋头敲代码吗?
  5. linux中的umask命令
  6. 点击area不出现黑框_30款厨房门,黑框?白框?你家选哪个合适?
  7. 谈谈汽车诊断之KWP2000/ISO14229/ISO15765/SAEJ1939
  8. 少儿故事:小乌鸦智斗老鹰
  9. 【Java】Fibonacci数列编程实现
  10. 音视频同步原理[ffmpeg]
  11. MQ(消息队列)常见的应用场景解析
  12. 医疗小程序源码_零售小程序源码,零售小程序商城
  13. 【PYTHON笔记】:文件打开和关闭
  14. 简历编写技巧-java开发工程师简历实战
  15. Ubuntu 16.04下安装激活pycharm 2018.3版本
  16. 【RPC】远程过程调用
  17. 阅文超级IP风云盛典星光熠熠 2018中国原创文学风云榜发布
  18. java 打包发布_一个java项目的打包与发布
  19. 数字频率计c语言程序,数字频率计中C语言编程的研究
  20. git memery 后 push到远程,如何回滚

热门文章

  1. C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型
  2. 百度超级链XChain(7)数据模型
  3. C++ Primer 5th笔记(chap 13 拷贝控制)=default
  4. 深度探索C++ 对象模型(4)-Default Copy Constructor(3)
  5. buuctf LSB
  6. 基于移位寄存器的序列密码
  7. boost库安装编译指南
  8. OPENFILENAME文件类型过滤 lpstrFilter
  9. vbs复制自身到启动文件夹
  10. Windows内核实验002 中断现场