Day2: 数组基础 ||

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;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值