《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_2
- 😍😍😍 相知
- 🙌🙌🙌 相识
- 😢😢😢 开始刷题
- 普通数组
- 🟡1. 最大子数组和
- 🟡2. 合并区间
- 🟡3. 轮转数组
- 🟡4. 除自身以外数组的乘积
- 🔴5. 缺失的第一个正数
- 矩阵
- 🟡6. 矩阵置零
- 🟡7. 螺旋矩阵
- 🟡8. 旋转图像
- 🟡9. 搜索二维矩阵II
😍😍😍 相知
刷题不要一上来就直接干,先看题,明白题说的什么意思,然后想一下用什么现成的算法和数据结构可以快速解决,如果还是无从下手,建议先去看视频,不要直接翻评论或官方代码实现,看完视频,自己在idea中模拟敲几遍代码,如果跑通了,先别急着上leetcode黏贴,而是再回顾一下要点,然后确定自己完全懂了后,在leetcode中手敲,注意是手敲下来!!! 目前我就是采用的这种方法,虽然慢,但是可以维持一周忘不掉它,如果要想长期不忘,只能隔段时间就review一下了,就算是大牛,知道方法,长时间不碰,也不可能保证一次到位把代码敲完一遍过!!!
🙌🙌🙌 相识
刷LeetCode热题100的想法有几个原因:
-
流行度高:LeetCode是一个广受欢迎的在线刷题平台,拥有大量用户和活跃的讨论社区。因此,热门题目通常代表了大多数人认为重要的题目或者面试中常见的题目。
-
面试备战:LeetCode上的题目往往和面试题目有很大的重合度。刷LeetCode热题100可以帮助你熟悉常见的面试题型和解题思路,提高应对面试的能力。
-
广泛的覆盖:热题100覆盖了各种难度级别的题目,包括简单、中等和困难。通过解答这些题目,可以提高自己的算法和编程能力,并扩展自己的知识面。
-
反馈和讨论:由于热题100是根据用户的反馈和讨论度排名的,因此这些题目往往有大量的解题思路和讨论可以参考。你可以从其他人的解题过程中学习到很多知识和技巧。
😢😢😢 开始刷题
普通数组
🟡1. 最大子数组和
题目跳转:https://leetcode.cn/problems/maximum-subarray/description/?envType=study-plan-v2&envId=top-100-liked
class Solution {public int maxSubArray(int[] nums) {if(nums.length<=0)return 0;int max = nums[0];int left = 0;int [] maxconut = new int[nums.length];maxconut[0] = nums[0];for(int right = 1;right < nums.length;right++){maxconut[right] = maxconut[right-1]+nums[right]>=nums[right]?maxconut[right-1]+nums[right]:nums[right];max = Math.max(max,maxconut[right]);}return max;}
}
🟡2. 合并区间
题目跳转:https://leetcode.cn/problems/merge-intervals/?envType=study-plan-v2&envId=top-100-liked
class Solution {public int[][] merge(int[][] intervals) {if(intervals.length<=1)return intervals;Arrays.sort(intervals, (a, b) -> a[0] - b[0]);ArrayList<int[]> arraylist = new ArrayList<>();int start = intervals[0][0];int rightbound = intervals[0][1];for(int i =1 ;i<intervals.length;i++){if(rightbound<intervals[i][0]){arraylist.add(new int[]{start, rightbound});start = intervals[i][0];rightbound = intervals[i][1];}else{rightbound = Math.max(rightbound,intervals[i][1]);}}arraylist.add(new int[]{start, rightbound});return arraylist.toArray(new int [0][0]);}
}
🟡3. 轮转数组
题目跳转:https://leetcode.cn/problems/rotate-array/?envType=study-plan-v2&envId=top-100-liked
学会一个函数:
System.arraycopy(nums,0,arr,nums.length-k,k);
直接举例:
arrayCopy( arr1, 2, arr2, 5, 10);
意思是;将
arr1
数组里从索引为2
的元素开始, 复制到数组arr2
里的索引为5
的位置, 复制的元素个数为10
个.
class Solution {public void rotate(int[] nums, int k) {if(nums.length<=1) return; k = k%nums.length;k = nums.length - k;int [] arr = new int [nums.length];System.arraycopy(nums,0,arr,nums.length-k,k);System.arraycopy(nums,k,arr,0,nums.length-k);System.arraycopy(arr,0,nums,0,nums.length);}}
🟡4. 除自身以外数组的乘积
题目跳转:https://leetcode.cn/problems/product-of-array-except-self/?envType=study-plan-v2&envId=top-100-liked
class Solution {public int[] productExceptSelf(int[] nums) {if(nums.length==1)return nums;int [][] temp = new int [2][nums.length];int [] result = new int [nums.length];for(int i = 0;i<nums.length;i++){if(i==0) temp[0][i] = 1;else{temp[0][i] = temp[0][i-1]*nums[i-1];}}for(int i = nums.length-1;i>=0;i--){if(i==nums.length-1) temp[1][i] = 1;else{temp[1][i] = temp[1][i+1]*nums[i+1];}}for(int i = nums.length-1;i>=0;i--){result[i] = temp[0][i]*temp[1][i];}return result;}
}
🔴5. 缺失的第一个正数
题目跳转:https://leetcode.cn/problems/first-missing-positive/?envType=study-plan-v2&envId=top-100-liked
把对应的数放到对应的索引处
class Solution {public int firstMissingPositive(int[] nums) {for(int i = 0;i < nums.length;i++ ){while(nums[i]>0&&nums[i]<nums.length){if(nums[i] == nums[nums[i]-1])break;int temp = nums[nums[i]-1];nums[nums[i]-1] = nums[i];nums[i] = temp;}}for(int i = 0;i < nums.length;i++ ){if(nums[i]!=i+1)return i+1;}return nums.length+1;}
}
矩阵
🟡6. 矩阵置零
题目跳转:https://leetcode.cn/problems/set-matrix-zeroes/description/?envType=study-plan-v2&envId=top-100-liked
得到原始数组 先遍历!
得到各个0位置之后,再处理。
class Solution {public void setZeroes(int[][] matrix) {if(matrix.length<=0||matrix[0].length<=0)return;ArrayList<int[]> temp = new ArrayList<>();for(int i = 0;i<matrix.length;i++){for(int j = 0;j<matrix[0].length;j++){if(matrix[i][j]==0){temp.add(new int[]{i,j});}}}for(int i = 0;i < temp.size();i++){int aa = 0;while(aa<matrix[0].length)matrix[temp.get(i)[0]][aa++] =0;int bb = 0;while(bb<matrix.length)matrix[bb++][temp.get(i)[1]] =0;}}
}
🟡7. 螺旋矩阵
题目跳转:https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-100-liked
定义几个边界值,然后遍历完一行或者 一列 则收缩一个值
class Solution {public List<Integer> spiralOrder(int[][] matrix) {if(matrix.length<=0||matrix[0].length<=0) return new ArrayList<>();List<Integer> list = new ArrayList<>();int left = 0;int right = matrix[0].length-1;int up = 0;int down = matrix.length-1;int row = left;int col = up;// 以上定义了变量while(left<=right||up<=down){while(row<=right){list.add(matrix[col][row++]);}up++;row = right;col = up;if(right<left||down<up)break;while(col<=down){list.add(matrix[col++][row]);}right--;row = right;col = down;if(right<left||down<up)break;while(row>=left){list.add(matrix[col][row--]);}down--;row = left;col = down;if(right<left||down<up)break;while(col>=up){list.add(matrix[col--][row]);}left++;row = left;col = up;if(right<left||down<up)break;}return list;}
}
🟡8. 旋转图像
题目跳转:https://leetcode.cn/problems/rotate-image/description/?envType=study-plan-v2&envId=top-100-liked
class Solution {public void rotate(int[][] matrix) {if(matrix.length<=0||matrix[0].length<=0)return;int left = 0;int right = matrix[0].length-1;int up = 0;int down = matrix.length-1;while(left<right){int temp = 0;for(int i = 0;i<right-left;i++){temp = matrix[up][left+i];matrix[up][left+i] = matrix[down-i][left];matrix[down-i][left] = matrix[down][right-i];matrix[down][right-i] = matrix[up+i][right];matrix[up+i][right] = temp;}left++;right--;up++;down--;}}
}
🟡9. 搜索二维矩阵II
题目跳转:https://leetcode.cn/problems/search-a-2d-matrix-ii/?envType=study-plan-v2&envId=top-100-liked
class Solution {public boolean searchMatrix(int[][] matrix, int target) {if(matrix.length<=0||matrix[0].length<=0)return false;int row = 0;int col = matrix[0].length-1;while(row>=0&&row<matrix.length&&col>=0&&col<matrix[0].length){if(matrix[row][col]==target)return true;else if(matrix[row][col]<target) row++;else col--;}return false;}
}