209.长度最小的子数组
思路:设置首尾指针,首尾指针初始位置相同,未指针逐个遍历数组并用sum储存它们的和,当sum≥target时,计算最小的数组大小,用sum减去当前首指针位置指向的值,首指针前移,持续循环直到sum<target,尾指针再开始移动。最后得到结果result
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result=Integer.MAX_VALUE;
int sum=0;
int j=0;//初始指针
// for(int i=0;i<nums.length;i++){
// sum=0;
// for(int j=i;j<nums.length;j++){
// sum+=nums[j];
// if(sum>=target){
// result = Math.min(result, j-i + 1);
// break;
// }
// }
// }
for(int i=0;i<nums.length;i++){//i是尾指针
sum+=nums[i];
while(sum>=target){//当数组和大于target时
result=Math.min(result,i-j+1);//存储最小长度
sum-=nums[j++];//并将初始指针指向位置的值删除,且前移一个位置
}//继续判断sum是否大于目标值
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59.螺旋矩阵II
思路:整体设计一个左闭右开的原则(不是真正意义上的左闭右开)然后对每一条边进行for循环遍历,四条边遍历完后,缩小圈的范围,继续遍历,直到圈总数为 n/2 即停止while循环
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums=new int[n][n];
int startX=0,startY=0;//初始行值和初始列值
int loop=1;//圈数
int offset=1;//用于控制每一条边的遍历长度
int count=1;//记录数组中的数值
int i,j;//代表行和列
while(loop<=n/2){//由题目示例可知,转的圈数总数为n/2
//上部
//行不变,列变,左闭右开,直到列值等于n-offset-1(因为右部也是左闭右开,所以不能取到n-offset)
for(j=startY;j<n-offset;j++){
nums[startX][j]=count++;
}
//右部
//列不变,行变,左闭右开,直到行值等于n-offset-1(因为下部部也是左闭右开,所以不能取到n-offset)
for(i=startX;i<n-offset;i++){
nums[i][j]=count++;
}
//下部
//下部是从右边开始的(这里为了方便就把右边当成了左边,即左闭右开),直到startX-1
for(;j>startY;j--){
nums[i][j]=count++;
}
//左部
//左部是从下边开始的(这里为了方便就把下边当成了左边,即左闭右开),直到startY-1
for(;i>startX;i--){
nums[i][j]=count++;
}
startX++;//依次更新初始行值和初始列值
startY++;
offset++;//更新控制每条边的遍历的长度,每缩一圈,offset加一(即每圈行列就会相应减少1)
loop++;//更新当前圈数,用于与 n/2 比较
}
if(n%2==1){//当n是奇数时,矩阵的中心位置是空缺的,要把中心值给补上
nums[startX][startY]=count;
}
return nums;
}
}