209.长度最小的子数组
思路:之前刷过一些题,所以先入为主的想用栈来实现滑动窗口,但具体怎么实现没搞清楚,就想了很久,这个还是使用双指针即可实现滑动窗口。
第一次写完代码报错了,没找到原因,对应代码随想录上的答案发现,在设计左窗口时,没有使用循环,就判断了一次,导致结果出错,修改后代码如下:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int subLength=nums.length+1;
int i=0;
for(int j=0;j<nums.length;j++){
sum+=nums[j];
while(sum>=target){
int length=j-i+1;
if(length<subLength){
subLength=length;
}
sum-=nums[i++];
}
}
if(subLength==nums.length+1){
return 0;
}else{
return subLength;
}
}
}
优化后的代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int subLength=Integer.MAX_VALUE;
int left=0;
for(int right=0;right<nums.length;right++){
sum+=nums[right];
while(sum>=target){
subLength=Math.min(subLength,right-left+1);
sum-=nums[left++];
}
}
return subLength==Integer.MAX_VALUE?0:subLength;
}
}
59.螺旋矩阵II
思路:一年前好像思考过这个题,但当时想了很久也没想出来,现在遇到题目不会再自己想破头了,直接看正确答案和思路会更清晰。
1、两层循环:
第一层循环是转的圈数n/2,如果n为奇数,需要单独给最中间的位置,也就是最后一圈的起点赋值。
第二层循环是四个边,遵循左闭右开的原则,每一个边是n-1个元素。
2、设置每一圈的起点[startX][startY],以及每一条边的终止变量offset;每完成一圈更新。
代码如下:
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums=new int[n][n];
int loop=1;//记录圈数
int startX=0,startY=0;
int offset=1;
int count=1;//计数
int i,j;
while(loop<=n/2){
for(j=startY;j<n-offset;j++){
nums[startX][j]=count++;
}
for(i=startX;i<n-offset;i++){
nums[i][j]=count++;
}
for(;j>startY;j--){
nums[i][j]=count++;
}
for(;i>startX;i--){
nums[i][j]=count++;
}
offset++;
startX++;
startY++;
loop++;
}
if(n%2!=0){
nums[startX][startY]=count;
}
return nums;
}
}
这个需要写的熟练,晚点会再练习一遍。