977.有序数组的平方
力扣链接:链接
思路
数组是有序递增的,负数平方以后可能会比前面的大,但是最大的数一定是在两端,并且往中间递减。所以采用双指针分别指向头尾比大小,往中间移动
代码
class Solution {
public int[] sortedSquares(int[] nums) {
int left=0;
int right=nums.length-1;
int[] result=new int[nums.length];
int p=nums.length-1;
while(left<=right){
if((nums[left]*nums[left])<nums[right]*nums[right]){
result[p]=nums[right]*nums[right];
right--;
p--;
}else{
result[p]=nums[left]*nums[left];
left++;
p--;
}
}
return result;
}
}
209.长度最小的子数组
力扣链接:链接
思路
找到的子数组是连续的,所以采用滑动窗口的方法,需要注意的是大于等于target而不仅仅是等于target
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int[] result=new int[nums.length];
int left=0;
int right=0;
int count=0;
int len=Integer.MAX_VALUE;
while(right<nums.length){
count+=nums[right];
while(count>=target){
len=Math.min(len,right-left+1);
count-=nums[left];
left++;
}
right++;
}
if(len==Integer.MAX_VALUE){
return 0;
}
return len;
}
}
59.螺旋矩阵Ⅱ
力扣链接:链接
思路
确定好区间以后四个方向都是相同区间,不要一会左开右闭一会左闭右开的。这里我用的是左闭右开的区间。然后确定好圈数以及每圈起始和终止位置(这里我在写从右到左,从下到上的方向时就没确定好终止条件,出现了第二圈覆盖),以及如果是奇数的话矩阵中心应该怎么处理
代码
class Solution {
public int[][] generateMatrix(int n) {
int loop=n/2;
int count=1;
int curloop=1;
int[][] result=new int[n][n];
int i,j;
while(curloop<=loop){
i=curloop-1;
j=curloop-1;
for(;j<n-curloop;j++){
result[i][j]=count++;
}
for(;i<n-curloop;i++){
result[i][j]=count++;
}
for(;j>curloop-1;j--){
result[i][j]=count++;
}
for(;i>curloop-1;i--){
result[i][j]=count++;
}
curloop++;
}
if(n%2==1){
result[curloop-1][curloop-1]=count;
}
return result;
}
}
小结
我发现好像会说非递减顺序的数组来代替说递增数组,所以看到的时候确认一下是不是说了不是连续数组。
数组基本上用的二分法(坚持循环不变量,确认好区间就不要动)、双指针法(在一个for循环下完成两个for循环需要完成的事)、滑动窗口(要找连续子序列)