代码随想录day02(977.有序数组的平方& 209.长度最小的子数组59.螺旋矩阵II)
977.有序数组的平方
题解:
平方后数的大小与平方前数的大小关系为绝对值大的平方后的值大,对于一个非递减顺序排序的数组来说,两端的数的绝对值较大,即可以利用一个双指针来进行比较逐渐向中间靠拢(使用Math.abs()函数可以求得绝对值
)
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int a=nums.length-1;
int left=0;
int right=a;
int size=a;
int[] num=new int[a+1];
while(left<=right){
if(Math.abs(nums[left]) > nums[right]){
num[size]=nums[left]*nums[left];
left++;
}else{
num[size]=nums[right]*nums[right];
right--;
}
size--;
}
return num;
}
}
209.长度最小的子数组
题解:
没啥思路先暴力一下
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int minLength = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
sum = 0;
for (int j = i; j < nums.length; j++) {
sum += nums[j];
if (sum >= target) {
minLength = Math.min(minLength, j - i + 1);
break;
}
}
}
return minLength == Integer.MAX_VALUE ? 0 : minLength;
}
}
也是运行成功了,看了下题目建议发现个名词:滑动窗口,思考一下,应该是一个可变化的窗口在数组上滑行,接下来就思考怎么变,怎么滑了,浅浅画一下
从图中可以看出当我们的窗口中数的总和小于我们的目标值时窗口左端不动,右端移动,当大于时右端不动,左端移动,直到将整个数组遍历完
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0;
int sum=0;
int miniLength=Integer.MAX_VALUE;
for(int right=0;right<nums.length;right++){
sum+=nums[right];
while(sum>=target){
miniLength=Math.min(miniLength,right-left+1);
sum-=nums[left];
left++;
}
}
return miniLength==Integer.MAX_VALUE ? 0:miniLength;
}
}
//在我们的暴力以及滑动窗口的方法中发现对minlength的操作均有如下操作
/*将miniLength的初值定义为整形的最大值的意义是:我们可以确保:
在找到有效解时,minLength 会被正确更新为最小长度。
在没有找到有效解时,minLength 保持其初始值,从而可以方便地判断是否有解。
*/
int minLength = Integer.MAX_VALUE;
miniLength=Math.min(miniLength,right-left+1);
/*
这个表达式检查 minLength 是否等于 Integer.MAX_VALUE。如果等于(即在整个过程中没有找到任何满足条件的子数组),则表达式返回 0,表示没有找到符合条件的子数组。如果不等于(即找到了至少一个满足条件的子数组),则返回 minLength,即找到的最小子数组长度。
*/
return minLength == Integer.MAX_VALUE ? 0 : minLength;
59.螺旋矩阵II
将每一个拐角作为我们跳出循环的节点(即拐点所在的值作为开区间)
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;
int[][] num = new int[n][n];
int start = 0;
int target = 1;
int y, x;
while (loop++ < n / 2) {
for (x = start; x < n - loop; x++) {
num[start][x] = target++;
}
for (y = start; y < n - loop; y++) {
num[y][x] = target++;
}
for (; x >= loop; x--) {
num[y][x] = target++;
}
for (; y >= loop; y--) {
num[y][start] = target++;
}
start++;
}
if (n % 2 == 1) {
num[start][start] = target;
}
return num;
}
}