209. 长度最小的子数组
解题思路
重点:双指针的滑动窗口
- i:指针指向开始点
- j:指向数组的结束点
- sum: 数组元素的和
- res:存储数组的长度:开始长度值要大于数组的值,如果最后值不变,则没有找到
*注意:需要不断的判断数组的和是否大于等于target,即尽可能多的移动i的位置,尽可能缩小窗口的大小
代码
var minSubArrayLen = function(target, nums) {
var sum = 0,res = nums.length + 1, i = 0;
for(var j =0; j<nums.length; j++){
sum += nums[j];
while(sum >= target){
res = Math.min(res, j - i + 1);
// 向右移动,左指针,比如 1,1,1,1,100 target=100
sum = sum - nums[i];
i++;
}
}
// 1,1,1,1,1,1 target = 10 这样子res 一直不变,所以设置长度大于数组的长度,这样就是找不到
if(res == nums.length + 1){
return 0;
}
return res;
};
59.螺旋矩阵II
解题思路
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。这里一圈下来,我们要画每四条边,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
左闭右开的原则,来画一圈
注意: 一共画几圈,就是 n>> 1 次数,如果是n是奇数,则只需要填充最中间的元素,即可。
- startX 每一轮的开始 x位置
- startY 每一轮的开始y 位置
- offset 每一轮每条边不需要填的个数 代码
var generateMatrix = function(n) {
var rc = n >> 1, startX = 0, startY =0, offset = 1, count = 1,
arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
while(rc){
for(let j = startY; j< n - offset;j++){
arr[startX][j] = count++;
}
for(let i = startX; i< n - offset; i++){
arr[i][n-offset] = count++;
}
for(let j = n - offset;j>startY;j--){
arr[n-offset][j] = count++;
}
for(let i = n - offset;i>startX;i--){
arr[i][startY]=count++;
}
startX++;
startY++;
offset++;
rc--;
}
if(n % 2 ===1){
arr[startX][startY] = count;
}
return arr;
};