长度最小的子数组
关键词:滑动窗口
解题思路
- 我的解法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i = 0;
int result = Max.;
for(int j=0; j<nums.length-1; j++){
int sum = 0;
int subLength = 0;
sum += 求i-j之间的和
if(sum >= target){
subLength = j - i + 1;
result = min(result, subLength);
i++;
}
}
return result;
}
- 正确的解法
滑动窗口
循环中使用while而不是if
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int j=0; j<=nums.length-1; j++){
sum += nums[j];
while(sum >= target){
result = Math.min(result, j-i+1);
sum -= nums[i];
i++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
螺旋矩阵
关键词:定义范围 左闭右开
解题思路
class Solution {
public int[][] generateMatrix(int n) {
//关键是定义每个边的范围,左闭右开原则去遍历
int[][] nums = new int[n][n];
int startx=0; int starty=0; //每一圈的起始值
int offset = 1; //定义左闭右开的最右边的值 该值随着圈数而增加 例如n=4,j取得最大值应该是到2=n-offset
int loop = 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++;//此处的j=3
}
//⏰最开始递减的两个循环条件范围给错了 给的是0
for(;j > startY; j--){
nums[i][j] = count++; //此处i=3
}
for(;i > startX; i--){
nums[i][j] = count++;//此处j=0
}
offset++;
loop++;
startx++;
starty++;
}
if(n%2==1){
nums[n/2][n/2] = count;
//⏰标准答案:nums[startX][startY] = count;
}
return nums;
}
}
拓展题目没做(区间和、开发商购买土地)