代码随想录算法训练营Day2|LeetCode

本文介绍了三种数组处理的算法问题:1)对排序数组进行平方后按顺序插入;2)寻找数组中和大于等于目标值的最小子数组长度;3)生成螺旋矩阵。这些方法分别使用了双指针和滑动窗口技巧,并提供了Python和JavaScript的实现代码。
摘要由CSDN通过智能技术生成

Day1+2: Array

Q977 Squares of a Sorted Array

双指针但倒序插入
'''
examples: [-4,-1,0,3,10]
output: [0,1,9,16,100]
'''
    def sortedSquares(self, nums: List[int]) -> List[int]:
        n = len(nums)
        ans =  [-1]*n
        start, end , k = 0, n-1, n-1 #一个从左到右,一个从右到左,ans倒序开始插入
        while start <= end:
            if nums[end]*nums[end] >= nums[start]*nums[start]:
                ans[k] = nums[end]*nums[end]
                end -= 1
            else:
                ans[k] = nums[start]*nums[start]
                start += 1
            k -= 1
        return ans
var sortedSquares = function(nums) {
    let n = nums.length;
    let start=0,end=n-1,k=n-1;
    let ans = new Array(n).fill(0); // in Python, [-1]*n
    while (start<=end){
        if (nums[start]*nums[start]<nums[end]*nums[end]){
            ans[k--]=nums[end]*nums[end];
            end--;
        }
        else {
            ans[k--]=nums[start]*nums[start];
            start++;
        }
    }
    return ans;
};

Q209 Minimum Size Subarray Sum

滑动窗口保持start_idx不变
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
    Sum, res = 0, float("inf")
    i = 0
    for j in range(len(nums)):
        Sum += nums[j]
        while Sum >= target:
            res = min(res, j-i+1)
            Sum -= nums[i]
            i += 1 # 移动start_idx的时刻
    return 0 if res == float("inf") else res
var minSubArrayLen = function(target, nums) {
    let start, end
    start = end = 0
    let sum = 0
    let ans = Infinity // in Python, res = float("inf")
    
    while(end < nums.length){
        sum += nums[end];
        while (sum >= target) {
            ans = Math.min(ans, end - start + 1);
            sum -= nums[start];
            start++;
        }
        end++;
    }
    return ans === Infinity ? 0 : ans // (condition)?(result:result)
};

Q59 Spiral Matrix

左闭右开loop
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0] * n for _ in range(n)]
        count = 1
        loop, mid = n//2, n//2
        startx, starty = 0, 0
        for offset in range(1, loop+1):
            # [left, right)
            for i in range(starty, n-offset):
                nums[startx][i] = count
                count += 1
            # [top, bottom)
            for i in range(startx, n-offset):
                nums[i][n-offset] = count
                count += 1
            # [right, left)
            for i in range(n-offset, starty, -1):
                nums[n-offset][i] = count
                count += 1
            # [bottom, top)
            for i in range(n-offset, startx, -1):
                nums[i][starty] = count
                count += 1
            startx += 1
            starty += 1
        if n%2 != 0:
            nums[mid][mid] = count
        return nums
var generateMatrix = function(n) {
    let startX = startY = 0;   // 起始位置
    let loop = Math.floor(n/2);   // 旋转圈数
    let mid = Math.floor(n/2);    // 中间位置
    let offset = 1;    // 控制每一层填充元素个数, 这里是每一层的元素个数,python的offset是值index偏移
    let count = 1;     // 更新填充数字
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

    while (loop--) {
        let row = startX, col = startY;
        // 上行从左到右(左闭右开)
        for (; col < startY + n - offset; col++) {
            res[row][col] = count++;
        }
        // 右列从上到下(左闭右开)
        for (; row < startX + n - offset; row++) {
            res[row][col] = count++;
        }
        // 下行从右到左(左闭右开)
        for (; col > startY; col--) {
            res[row][col] = count++;
        }
        // 左列做下到上(左闭右开)
        for (; row > startX; row--) {
            res[row][col] = count++;
        }

        // 更新起始位置
        startX++;
        startY++;

        // 更新offset, 所以这里是连减2
        offset += 2;
    }
    // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
    if (n % 2 === 1) {
        res[mid][mid] = count;
    }
    return res;
};

Reference from: https://programmercarl.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值