题目1:
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
自己:双层for
修正:解决双层for 关键在于自己触发一个遍历的位置
核心: 滑动窗口(双指针),
核心在于用一个for解决两个for嵌套的问题,
for里是fast指针的便利,
slow指针移动触发条件!sum大于target*/
答案:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0;
int sum=0;
boolean flag=false;
int len=nums.length;
for(int j =0;j<nums.length;j++){
sum=sum+nums[j];
while(sum>=target){
len=len>j-i+1?j-i+1:len;
sum=sum-nums[i];
i++;
flag=true;
}
}
if(flag==true) {
return len;
}else{
return 0;
}
}
}
题目2 螺旋矩阵
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵
自己:
1.循环规则
2.循环结束条件
修正(错误点):
1.圈数判断<=n/2, 奇数+多处理中心(错误点)
2.没有细分各种会变的概念(会变的参数)-圈数是圈数,偏移是偏移,数值是数值,每一圈起点,这些需要都定义出来
3. nums[startX][j] = count++
也就是 nums[0][0] = 1
,然后 count
变为 2是先=后+;
核心:
答案:
class Solution {
public int[][] generateMatrix(int n) {
int loop=1;
int[][] nums=new int[n][n];
int i;
int j;
int count=1;
int offset=1;
int startX = 0, startY = 0;
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++;
}
loop++;
offset++;
startX++;
startY++;
}
if(n%2==1){
nums[startX][startY] = count;
}
return nums;
}
}