209.长度最小的子数组
function minSubArrayLen(target: number, nums: number[]): number {
let left = 0, right = 0;
let sum = 0;
let min_length = undefined;
let length = 0;
while(right < nums.length){
while(right < nums.length && sum < target){
sum += nums[right];
length++;
right++;
}
if(length === nums.length && sum < target){
return 0;
}
sum -= nums[left];
while(sum >= target){
length--;
left++;
sum -= nums[left];
}
if(!min_length || min_length > length){
min_length = length;
}
left++;
length--;
}
return min_length;
};
思考的点:
滑动窗口中有负数怎么办?
如果有负数的话感觉也不能用滑动窗口了,因为有负数的话无论你收缩还是扩张窗口,你里面的值的总和都可能增加或减少,就不像之前收缩一定变小,扩张一定变大,一切就变得不可控了。如果要 cover 所有的情况,那每次 left 都要缩到 right,那就退化为暴力了。
59.螺旋矩阵II
坚持循环不变量原则,注意要区分基数和偶数的情况
function generateMatrix(n: number): number[][] {
let row = n - 1, column = n - 1;
let matrix = new Array(n).fill(0).map(item => new Array(n).fill(0));
let layer = 0;
let num = 1;
while(layer < Math.ceil(n / 2)){
for(let i = layer; i < n - 1 - layer; i++){
matrix[layer][i] = num++;
}
for(let i = layer; i < n - 1 - layer; i++){
matrix[i][n - 1 - layer] = num++;
}
for(let i = n - 1 - layer; i > layer; i--){
matrix[n - 1 - layer][i] = num++;
}
for(let i = n - 1 - layer; i > layer; i--){
matrix[i][layer] = num++;
}
layer++;
}
if(Math.ceil(n / 2) != n / 2 )
matrix[Math.ceil(n / 2) - 1][Math.ceil(n / 2)- 1] = num++;
return matrix;
};
官方题解:
function generateMatrix(n: number): number[][] {
let loopNum: number = Math.floor(n / 2);
const resArr: number[][] = new Array(n).fill(1).map(i => new Array(n));
let chunkNum: number = n - 1;
let startX: number = 0;
let startY: number = 0;
let value: number = 1;
let x: number, y: number;
while (loopNum--) {
x = startX;
y = startY;
while (x < startX + chunkNum) {
resArr[y][x] = value;
x++;
value++;
}
while (y < startY + chunkNum) {
resArr[y][x] = value;
y++;
value++;
}
while (x > startX) {
resArr[y][x] = value;
x--;
value++;
}
while (y > startY) {
resArr[y][x] = value;
y--;
value++;
}
startX++;
startY++;
chunkNum -= 2;
}
if (n % 2 === 1) {
resArr[startX][startY] = value;
}
return resArr;
};