文档讲解:977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II、数组总结篇
题目链接:977.有序数组的平方、209.长度最小的子数组、59.螺旋数组II
视频讲解:977.有序数组的平方_哔哩哔哩_bilibili、209.长度最小的子数组_哔哩哔哩_bilibili、59.螺旋数组II_哔哩哔哩_bilibili
思路:
1、第一道题和昨天的移除元素差不多,都是使用的双指针,从start和end两头进行遍历,存放在新的数组中,是一道简单题目。
2、第二题是一道滑动窗口的题目,核心思想还是双指针,不过对于双指针的处理是将窗口中元素和用sum确定,而不确定元素个数,如果元素和sum大于等于target,则将左指针++,并计算最小元素个数,小于target就将右指针++,移动元素个数为2*n,所以其时间复杂度为O(n)。
3、第三道题比较难的点是边界的判断,相较于前面的题会更复杂,首先要n/2判断要执行多少圈,如果是奇数最后再加上最中间的那个元素,其次判断每一行每一列执行的过程,然后执行完一圈起始位置++,圈数也要++。
977.有序数组的平方
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int num = nums.length-1;
int start = 0;
int end = nums.length-1;
while(start<=end){
if(nums[start]*nums[start] > nums[end]*nums[end]){
res[num] = nums[start]*nums[start];
num--;
start++;
}else{
res[num] = nums[end]*nums[end];
num--;
end--;
}
}
return res;
}
}
209.长度最小的子数组
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int right = 0;right<nums.length;right++){
sum+=nums[right];
while(sum>=target){
result = Math.min(result, right-left+1);
sum-=nums[left++];
}
}
return result==Integer.MAX_VALUE ? 0:result;
}
}
59.螺旋矩阵II
class Solution {
public int[][] generateMatrix(int n) {
if(n == 1){
int[][] result = {{1}};
return result;
}
int loop = 0;
int start = 0;
int[][] result = new int[n][n];
int i=0,j=0;
int num=1;
while(loop++ < n/2){
for(j=start;j<n-loop;j++){
result[start][j] = num++;
}
for(i=start;i<n-loop;i++){
result[i][j] = num++;
}
for(;j>=loop;j--){
result[i][j] = num++;
}
for(;i>=loop;i--){
result[i][j] = num++;
}
start++;
}
if(n%2==1){
result[start][start] = num;
}
return result;
}
}
总结
两天的时间做完代码随想录关于数组的题目,跟着训练营节奏走,确实很有效率,会担心掉队。这两天主要是对双指针应用的比较多,也算巩固了之前的学习成果。