技术干货(四)「LeetCode」51 - 60题详解( 二 )
解法二public List
55. 跳跃游戏给定一个非负整数数组 , 你最初位于数组的第一个位置 。
数组中的每个元素代表你在该位置可以跳跃的最大长度 。
判断你是否能够到达最后一个位置 。
【技术干货(四)「LeetCode」51 - 60题详解】示例 1:
输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步 , 从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置 。
示例 2:
输入: [3,2,1,0,4]输出: false解释: 无论怎样 , 你总会到达索引为 3 的位置 。 但该位置的最大跳跃长度是 0,所以你永远不可能到达最后一个位置 。 public boolean canJump(int[] nums) {// 能达到的最大下标int dist = 0;// 越界或超过能够达到的最大距离跳出循环for(int i = 0 ; i< nums.lengthi++){dist = Math.max(dist,nums[i]+ i);}// 看看是因为什么原因跳出的循环return dist>= nums.length -1;}
56. 合并区间给出一个区间的集合 , 请合并所有重叠的区间 。
示例 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日更改 。请重置默认代码定义以获取新方法签名 。
提示:
- intervals[i][0] <= intervals[i][1]
public int[][] merge(int[][] nums) {int len = nums.length;if(len < 2) return nums;// 按照左端点排序Arrays.sort(nums, (o1, o2)->(o1[0] - o2[0]));// 结果集 , 每次比较之后 , 加入一个进结果集List res = new ArrayList<>();// 初始化先加入第一个res.add(nums[0]);for(int i = 1; i < len; i ++){// 后一个int[] curr = nums[i];// 前一个int[] peek = res.get(res.size() - 1);// 前一个的右端点 > 后一个的左端点 -> 没有交叉 直接加入if(curr[0] > peek[1]) res.add(curr);else{// 否则直接改变前一个的右端点为两者的最大值即可peek[1] = Math.max(curr[1], peek[1]);}}// list -> arrayreturn res.toArray(new int[res.size()][]);}
57. 插入区间给出一个无重叠的, 按照区间起始端点排序的区间列表 。在列表中插入一个新的区间 , 你需要确保列表中的区间仍然有序且不重叠(如果有必要的话 , 可以合并区间) 。
示例 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[][] nums, int[] newNum) {int newStart = newNum[0], newEnd = newNum[1];int idx = 0, n = nums.length;LinkedList res = new LinkedList<>();// 将左端点小于newNums左端点的加入reswhile(idx < nint[] temp = new int[2];// res为空或者 没有交点[最后一个右端点 < newNum的左端点]if (res.isEmpty() || res.getLast()[1] < newStart) res.add(newNum);// 更新res最后一个的右断点else res.getLast()[1] = Math.max(res.getLast()[1], newEnd);// 处理剩余的while(idx < n){// temp就是之后遍历的区间temp = nums[idx ++];int start = temp[0], end = temp[1];// 上一个的右端点小于 下一个的左端点 ,没有交集if (res.getLast()[1] < start) res.add(temp);else res.getLast()[1] = Math.max(res.getLast()[1], end);}return res.toArray(new int[res.size()][]);}
58. 最后一个单词的长度给定一个仅包含大小写字母和空格 ' ' 的字符串 s , 返回其最后一个单词的长度 。 如果字符串从左向右滚动显示 , 那么最后一个单词就是最后出现的单词 。如果不存在最后一个单词 , 请返回 0。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串 。
示例:
输入: "Hello World"输出: 5public int lengthOfLastWord(String s) {// s (i,j]仅包含大小写字母和空格int j = s.length() - 1;while(j >= 0int i = j;while(i >= 0return j - i;}
59. 螺旋矩阵 II给定一个正整数 n , 生成一个包含 1 到 n2 所有元素 , 且元素按顺时针顺序螺旋排列的正方形矩阵 。
- 浙江省|浙江的五大富豪,四位做过中国首富,仅马云的阿里就1年纳税366亿
- 三星|顶配旗舰重回最低价,三个月降价四百,12G+256G+120W
- 酷比魔方|持续推进技术储备,网易星球区块链技术或成元宇宙入场券
- OPPO|OPPO未来科技大会正式官宣,官方明示将有旗舰新品和创新技术亮相
- 支付宝|突破2项关键技术,中科院又立功了,事关量子计算和3D打印
- 东芝|如何分辨手机配置的“好坏”?认清这四点,你也能成为行家
- 微单|动辄10999元!12GB运存+512GB+微单技术,索尼的定价只能服
- 技术|张勇内部分享,解读阿里巴巴技术路线:把先进技术用到真实的大场景里去
- 电池|2021年年底买千元机,这四款用三五年没问题,十二月购机必看
- realme|盘点2021年最受好评的四款智能手表,双十二这样买不会出错