文章目录
day02学习内容
day02主要内容
- 有序数组的平方–双指针
- 长度最小的子数组–滑动窗口
- 螺旋矩阵–模拟
一、有序数组的平方
1.错误写法1
class Solution {
public int[] sortedSquares(int[] nums) {
int i = 0;
int j = nums.length - 1;
int index = nums.length - 1;
int[] result = new int[nums.length];
while (i <= j) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
result[index] = nums[i] * nums[i];
i++;
} else if(nums[i] * nums[i] < nums[j] * nums[j]){
result[index] = nums[j] * nums[j];
j--;
}
index--;
}
return result;
}
}
为啥不能这么写呢。主要是漏了等于号,在俩个元素乘积相等的时候,会跳出循环,导致死循环,具体看下面的debug代码,或者自己复制下来debug一遍就知道了。
2.正确写法1
public int[] sortedSquares(int[] nums) {
int i = 0;
int j = nums.length - 1;
int index = nums.length - 1;
int[] result = new int[nums.length];
while (i <= j) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
result[index] = nums[i] * nums[i];
i++;
} else if(nums[i] * nums[i] < nums[j] * nums[j]){
result[index] = nums[j] * nums[j];
j--;
}
index--;
}
return result;
}
2.正确写法2
先自增再赋值,写法也是ok的
public int[] sortedSquares(int[] nums) {
int i = 0;
int j = nums.length - 1;
int index = nums.length - 1;
int[] result = new int[nums.length];
while (i <= j) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
result[index] = nums[i] * nums[i];
++i;
} else if(nums[i] * nums[i] < nums[j] * nums[j]){
result[index] = nums[j] * nums[j];
--j;
}
--index;
}
return result;
}
二、长度最小的子数组
1.错误1
2.正确写法1
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start = 0;
int end=0;
int n = nums.length;
int sum =0;
int result = Integer.MAX_VALUE;
while(end<nums.length){
sum +=nums[end];
while(sum>=target){
//如果找到和大于的,就缩小范围,继续找有没有更小的范围
int subLength=end-start+1;//这里为啥要+1,以为数组下表是从0开始的,肯定得加1
result=Math.min(result,subLength);
//缩小查找范围,就是把起始位置往右移动。
sum-=nums[start];
start++;
}
//不管有没有找到和大于的,终点位置都要加1.
end++;
}
return result==Integer.MAX_VALUE?0:result;
}
}
3.正确写法2
只是把end的初始化放到了for循环里面,对于初学者来说,比第一种稍微难理解一点点。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int end=0;end<nums.length;end++){
sum +=nums[end];
while(sum>=target){
int subLength=end-start+1;
result=Math.min(result,subLength);
sum-=nums[start];
start++;
}
}
return result==Integer.MAX_VALUE?0:result;
}
}
三、螺旋矩阵
1.没写出来,想不明白,先抄答案。。。
今天上班比较忙。