训练营一期day2

文章介绍了在LeetCode上解决三个问题的思路,包括有序数组的平方排序、找到长度最小的子数组使其和大于等于目标值以及生成螺旋矩阵的算法。作者分享了初始想法、优化后的解决方案以及遇到的困难,特别是终止条件的设定。
摘要由CSDN通过智能技术生成

# 977. 有序数组的平方

- 视频链接:

https://leetcode.cn/problems/squares-of-a-sorted-array/

- 第一想法:

已知是有序数组,所以数组两端的绝对值的其中一个一定是最大的。所以设置了两个指针分别指向一头一尾。将最大值倒着填入新的有序平方数组。如果左端的值大于右端的值,把左端的值平方后放入数组,左指针向右移动一位;如果左端的值小于于右端的值,把右端的值平方后放入数组,右指针向左移动一位。

def sortedSquares(nums):
    if len(nums) == 0:
        return []
            
    l = 0
    r = len(nums)-1
    new_arr = [0]*len(nums)
    idx = len(nums)-1

    while idx>=0:
        if abs(nums[l]) >= abs(nums[r]):
            new_arr[idx] = nums[l]**2
            l += 1
        else:
            new_arr[idx] = nums[r]**2
            r -= 1
        idx -= 1
        
    return new_arr

- 看完代码随想录的想法:

一样的做法。不一样的终止条件。我用的是idx >= 0,代码随想录里面的是l<=r

- 困难:无

# 209. 长度最小的子数组

- 视频链接:

https://leetcode.cn/problems/minimum-size-subarray-sum/

- 第一想法:

超时。过了给的三个基本测试用例。不太确定终止条件。

def minSubArrayLen(traget,nums):
    l,r=0,1
    min_len = float('inf')

    if sum(nums) < target:
        return 0

    while r<=len(nums):
        sum_sub = sum(nums[l:r])
        if sum_sub >= target:
            if r-l < min_len:
                min_len = r-l
            l += 1
        else:
            r += 1

    return min_len 

- 看完代码随想录后:

def minSubArrayLen(target,nums):
    min_len = float('inf')
    l = 0
    sum_sub = 0

    if sum(nums) < target:
        return 0
    
    for r in range(len(nums)):
        sum_sub += nums[r]
        while sum_sub >= target:
            min_len = min(min_len, r-l+1)
            sum_sub -= nums[l]
            l += 1
    return min_len

- 困难:把思路局限在只用一个while loop,所以不知道怎么设置终止条件。

# 59. 螺旋矩阵II

- 视频链接:

https://www.bilibili.com/video/BV1SL4y1N7mV/

- 第一想法:

尝试寻找规律。感觉要一圈一圈的填,但是想不出终止条件

(0,0) (0,1) (0,2) .... (0,n-1)

(1,n-1) (2,n-1).... (n-1,n-1)

(n-1,n-2) (n-1,n-3) .... (n-1,0)

(n-2,0) (n-3,0) ... (1,0)

- 看完代码随想录:

1. 要使用左闭右开

2. 以offset为终止条件

def generateMatrix(n):
    mat = [[0] * n for _ in range(n)]
    num = 1 # initial number
    count = n // 2 # number of loops
    startX, startY = 0,0

    for offset in range(1,count+1):
        # from left to right
        for i in range(startY,n-offset):
            mat[startX][i] = num
            num += 1
        # from upper to lower
        for i in range(startX,n-offset):
            mat[i][n-offset] = num
            num += 1
        # from right to left
        for i in range(n-offset,startY,-1):
            mat[n-offset][i] = num
            num += 1
        # from lower to upper
        for i in range(n-offset,startX,-1):
            mat[i][startY] = num
            num += 1
        
        startX += 1
        startY += 1

    if n%2 != 0: # when n is odd, fill in the center of matrix
        mat[n//2][n//2] = n**2
    
    return mat

- 困难:想不出终止条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值