0811(补)代码随想录|有序数组的平方、长度最小的子数组、螺旋矩阵||

##LC977 有序数组的平方
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        i = 0
        j = len(nums)-1

        a = [0]*len(nums)
        cnt = len(nums)-1
        while i <=j:
            if nums[i]*nums[i] > nums[j]*nums[j]:
                a[cnt] = nums[i]*nums[i]
                i = i+1
                cnt = cnt -1
            else:
                a[cnt] = nums[j]*nums[j]
                j = j-1
                cnt = cnt-1        
        return a
  • 可以直接用暴力法解决这一个问题,将数组各数字进行平方后直接进行排序,O(logn),不符合进阶条件。
  • 使用双指针法,是数组题目中常见的操作,双指针有两种指法:一种由中间向两边扩散,一方到头后另一方完全填入,正向append进提前准备的数组。另一种由两边向中间指,其判断条件以及循环过程明显好于第一种,建议使用。
##LC209 长度最小的子数组
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        i = 0
        j = 0
        cur_sum = 0
        mins = len(nums)

        while j < len(nums):
            cur_sum += nums[j]

            if cur_sum < target:
                # cur_sum += nums[j]
                j += 1
            else:
                # mins = min(j-i+1,mins)
                if j-i+1<mins:
                    mins = j-i+1
                cur_sum -= nums[i]
                i += 1
                cur_sum -= nums[j]
                

            if i==0 and j ==len(nums):
                return 0

            if mins ==1:
                return 1                
        return mins

滑动窗口方法

##LC59 螺旋矩阵 II
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        l, r, t, b = 0, n-1, 0, n-1
        mat = [[0 for _ in range(n)] for _ in range(n)]
        num = 1
        tar = n*n
        while num <= tar :
            for i in range(l,r+1):
                mat[t][i] = num
                num += 1
            t = t + 1

            for i in range(t,b+1):
                mat[i][r] = num
                num += 1
            r = r-1

            for i in range(r,l-1,-1):
                mat[b][i] = num
                num += 1
            b = b-1

            for i in range(b,t-1,-1):
                mat[i][l] = num
                num += 1
            l += 1

        return mat

纯正的模拟题目 很有意思,有两种写法,一种是上面那种分上下左右,然后以填入的数字个数记录,另一种用循环次数以及偏移量记录,需要多加练习。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值