classSolution{publicint[]sortedSquares(int[] nums){int n = nums.length;int i =0;int k = n -1;//直接倒着记录int j = n -1;int[] res =newint[n];while(i <= j){if(nums[i]*nums[i]>= nums[j]*nums[j]){
res[k]= nums[i]*nums[i];
i++;//k++;}else{
res[k]= nums[j]*nums[j];
j--;//k++;}
k--;if(k ==-1){break;}}return res;}}
长度最小的子数组
核心思想:
滑动窗口:滑动窗口本质就是一种同向的双指针,结合题目的含义,用左右/快慢指针来维持一个窗口。
经典题目:
最小覆盖字串
无重复字符的最长字串
水果成篮
本题的代码:
classSolution{publicintminSubArrayLen(int target,int[] nums){int n = nums.length;int i =0;int j =0;int sum =0;intL= n +1;for(i =0; i < n; i++){if(sum < target){
sum += nums[i];}while(sum >= target){L=Math.min(i - j +1,L);
sum -= nums[j];
j++;}}returnL== n +1?0:L;}}
螺旋二维数组
本质就是模拟
代码
classSolution{publicint[][]generateMatrix(int n){int[][] arr =newint[n][n];int r = n -1;int l =0;int b = n -1;int t =0;int m = n * n;int i =0;while(m-->0){for(int j = l; j < r; j++){
arr[t][j]=++i;}for(int j = t; j < b; j++){
arr[j][r]=++i;}for(int j = r; j > l; j--){
arr[b][j]=++i;}for(int j = b; j > t; j--){
arr[j][l]=++i;}
r--;
l++;
b--;
t++;}if(n %2==1){
arr[n/2][n/2]= n*n;}return arr;}}
存在问题:
不够熟练
本题相关题目的注意点
注意边界,
力扣54题是本题的逆过程。尤其需要注意边界
力扣54题代码
classSolution{publicList<Integer>spiralOrder(int[][] matrix){List<Integer> res =newArrayList<>();int m = matrix.length;int n = matrix[0].length;int r = n -1;int l =0;int t =0;int b = m -1;int count = m * n;while(l < r && t < b){if(l < r){for(int i = l; i < r; i++){
res.add(matrix[t][i]);
count--;}}if(t < b){for(int i = t; i < b; i++){
res.add(matrix[i][r]);
count--;}}if(l < r){for(int i = r; i > l; i--){
res.add(matrix[b][i]);
count--;}}if(t < b){for(int i = b; i > t; i--){
res.add(matrix[i][l]);
count--;}}
b--;
r--;
l++;
t++;}------打印test数组可以用来检测最后的停落点-----List<Integer> test =newArrayList<>();
test.add(b);
test.add(r);
test.add(l);
test.add(t);--------------------------------------------if(b == t){for(int i = l; i <= r; i++){
res.add(matrix[b][i]);}}elseif(r == l){for(int i = t; i <= b; i++){
res.add(matrix[i][r]);}}return res;}}