代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
题解:双指针,重新开辟一个新的数组来存储平方后的值。因为数组是按从小到大的顺序排列的,那么最大的数不是在最左边就是在最右边。那么将左右指针分别指向这两个值,两者相加,如果是整数,那么说明右边的数大,将右边的数平方后放到结果数组res中,然后右指针–,反之则左指针++。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int l=0,r=nums.length-1;
int [] res=new int [r+1];
int index=r;
while(l<=r){
if(nums[r]+nums[l]>0){
res[index--]=nums[r]*nums[r];
r--;
}else{
res[index--]=nums[l]*nums[l];
l++;
}
}
return res;
}
}
209.长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
题解:双指针+滑动窗口。右指针一直往右走,并且对走过的地方求和,当这个和大于等于目标值时,在for循环中用一个while循环,让sum减去左指针的值,左指针也往前走,同时更新最小长度,直到sum的值减到小于target,退出循环,回到右指针。比较时,可以采用三目运算符
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res=Integer.MAX_VALUE,sum=0;
int l=0;
for(int r=0;r<nums.length;r++){
sum+=nums[r];
while(sum>=target){
res=res<(r-l+1)?res:(r-l+1);
sum-=nums[l++];
}
}
return res==Integer.MAX_VALUE?0:res;
}
}
59.螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
题解:模拟题,模拟转圈的过程。写个例子,可以发现,矩阵的圈数loop是n的1/2,那么就循环loop次,每一个圈往圈中填充数据。需要注意的是,每一圈的起始位置是不一样的,所以要动态的定义每一圈的起始位置。循环的规则要统一,比如统一不处理最左边的那个数,或者最右边的那个数。(看着代码理解吧)
代码:
class Solution {
public int[][] generateMatrix(int n) {
int start=0;
int offset=1;
int count=1;
int loop=0;
int i,j;
int res[][]=new int[n][n];
while(loop<n/2){
for(j=start;j<n-offset;j++){
res[start][j]=count++;
}
for(i=start;i<n-offset;i++){
res[i][j]=count++;
}
for(;j>=offset;j--){
res[i][j]=count++;
}
for(;i>=offset;i--){
res[i][start]=count++;
}
start++;
offset++;
loop++;
}
if(n%2==1) res[start][start]=n*n;
return res;
}
}