数组
- 暴力解法,力扣超时
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n=nums.length;
int count=0;//子序列的长度,中间变量,用于与res对比;
int res=n+1;// 最终结果,先随便定义一个
int sum=0;//子序列的数值之和
for(int i=0;i<n;i++){
sum=0;
for(int j=i;j<n;j++){
sum+=nums[j];
if(sum>=target){
count=j-i+1;
res=Math.min(res, count);
break;
}
}
}
return res == n+1 ? 0 : res;
}
}
- 滑动窗口
- 窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
- 窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
- 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
- 就是说for循环索引用结束位置,用起始位置思路就跟暴力一样了。代码随想录的图画的很形象,看几遍就懂了。programmercarl.com/0209.%E9%95…
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n=nums.length;
int count=0;//子序列的长度,中间变量,用于与res对比;
int res=n+1;// 最终结果,先随便定义一个
int sum=0;//子序列的数值之和
int i=0;//起始位置
for(int j=0;j<n;j++){//先滑终止位置
sum+=nums[j];
while(sum>=target){//再滑起始位置
count=j-i+1;
res=Math.min(res, count);
sum-=nums[i];
i++;
}
}
return res == n+1 ? 0 : res;
}
}
力扣上的精选答案,比代码随想录的清晰 leetcode.cn/problems/sp…
- 定义当前左右上下边界
l,r,t,b,初始值num = 1,迭代终止值tar = n * n;
- 当
num <= tar时,始终按照从左到右从上到下从右到左从下到上填入顺序循环,每次填入后: 执行num += 1,得到下一个需要填入的数字;更新边界,例如从左到右填完后,上边界t += 1,相当于上边界向内缩 1。
- 使用
num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。//这地方不是很懂,我用l < r || t < b也能过
- 最终返回
mat即可。
class Solution {
public int[][] generateMatrix(int n) {
int l=0,r=n-1,t=0,b=n-1;
int[][] mat= new int[n][n];
int num=1,tar=n*n;
while(num <= tar){
for(int i=l;i<=r;i++){
mat[t][i]=num;
num++;
}
t++;
for(int i=t;i<=b;i++){
mat[i][r]=num;
num++;
}
r--;
for(int i=r;i>=l;i--){
mat[b][i]=num;
num++;
}
b--;
for(int i=b;i>=t;i--){
mat[i][l]=num;
num++;
}
l++;
}
return mat;
}
}