[豪の算法奇妙冒险] 代码随想录算法训练营第二天 | 209-长度最小的子数组、59-螺旋矩阵II
代码随想录算法训练营第二天 | 209-长度最小的子数组、59-螺旋矩阵II
LeetCode209 长度最小的子数组
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
一开始用的两层for循环,尝试暴力遍历求解,但最后不出意料的超时了:

class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minlen = nums.length + 1;
for(int i = 0;i < nums.length;i++){
int sum = 0;
int curlen = 0;
for(int j = i;j < nums.length;j++){
sum += nums[j];
curlen++;
if(curlen >= minlen || sum >= target){
break;
}
}
if(sum >= target && curlen < minlen){
minlen = curlen;
}
}
if(minlen > nums.length){
return 0;
}else{
return minlen;
}
}
}
然后看了讲解视频,发觉使用双指针滑动窗口的思路解决这道题会更加合适
用滑动窗口,可以用一个for代替暴力求解的两个for
关键在于确定如何移动起始位置,然后持续向后移动,更新滑动窗口的大小

class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minlen = nums.length + 1;
int i = 0;
int sum = 0;
for(int j = 0;j < nums.length;j++){
sum += nums[j];
while(sum >= target){
int curlen = j-i+1;
if(minlen > curlen){
minlen = curlen;
}
sum -= nums[i];
i++;
}
}
if(minlen > nums.length){
return 0;
}else{
return minlen;
}
}
}
LeetCode59 螺旋矩阵II
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
这题就是要明确循环不变量,确定好一套边界处理规则
把边界条件搞清晰,这题也就迎刃而解了

class Solution {
public int[][] generateMatrix(int n) {
int startI = 0,startJ = 0,offset = 1;
int cnt = 1;
int loop = n/2;
int[][] result = new int[n][n];
while(true){
loop--;
if(loop < 0){
break;
}
int i = startI;
int j = startJ;
for(;j < n-offset;j++){
result[startI][j] = cnt++;
}
for(;i < n-offset;i++){
result[i][n-offset] = cnt++;
}
for(;j > startJ;j--){
result[n-offset][j] = cnt++;
}
for(;i > startI;i--){
result[i][startJ] = cnt++;
}
startI++;
startJ++;
offset++;
}
if(n%2 == 1){
result[n/2][n/2] = cnt;
}
return result;
}
}
扩展题目:KamaCode58 区间和、KamaCode44 开发商购买土地
扩展题目留着周末再另外做...

浙公网安备 33010602011771号