数据结构Day2 977有序数组的平方 209 长度最小的子数组 59螺旋矩阵(2⃣️)

977 有序数组的平方

思路:这个列表其实内部已经排过序(非递减),用对撞指针不断逼近,绝对值较大的放在列表尾部,绝对值较小的放在列表头部。

但是一开始忽略了列表长度为1时的列表情况,把题算错了(提醒以后一定要注意列表为1时这种临界条件的测试)

总感觉这题背后的left和right是否能够相等有大文章,什么时候想等,什么时候不等于,可以总结一下

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        #用双指针,比较绝对值的大小,不断加到列表尾部
        left ,right = 0,len(nums)-1
        num = [0]*len(nums)
        n = -1
        if len(nums) == 1:
            return [nums[0]**2]
        while left < right:
            a,b = abs(nums[left]),abs(nums[right])
            if a <= b:
                num[n] = b**2
                right -= 1
            else:
                num[n] = a**2
                left += 1
            n -= 1
        if a <= b:
            num[0] = a**2
        else:
            num[0] = b**2
        return num

写的太臃肿,第一个元素的处理和一个元素的列表的处理

209. 长度最小的子数组

如果是不停的去找最小值时,应当用无穷大的符号

float('inf')
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left,right,total,minlen= 0,0,0,float('inf')
        while right <= len(nums)-1:
            total += nums[right]
            while total >= target:    
                minlen = min(minlen,right-left+1)
                total -= nums[left]
                left += 1         
            right += 1
        return minlen if minlen != float('inf') else 0

滑动窗口的思想,应该是要关注比较快的指针,right处的,而且这道题注意一下是用while循环控制,这一点老是写错,可能是写代码的方法有问题,可以模拟一个简单的过程,不出错后不停迭代。

这一部分还是要加大训练的力度!!!!

59.螺旋矩阵(2)

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        #是一个模拟数组的题,一定要清楚这个顺序
        left,right,up,down = 0,n-1,0,n-1
        number = 1
        matrix = [[0 for _ in range(n)] for _ in range(n)]
        while left < right and up < down:
            for i in range(left,down):
                matrix[up][i] = number
                number += 1
            for i in range(up,down):
                matrix[i][right] = number
                number += 1
            for i in range(right,left,-1):
                matrix[down][i] = number
                number += 1
            for i in range(down,up,-1):
                matrix[i][left] = number
                number += 1
            left += 1
            right -= 1
            up += 1
            down -= 1
        if n%2 == 1:
            n1 = n//2
            matrix[n1][n1] = number
        return matrix

这里面存在一个深拷贝还是浅拷贝的问题

[[0 for _ in range(n)] for _ in range(n)]

只有这么初始化,才能保证里边的各个列表不会指向同一个位置

[[0]*n]*n

这样写最后的每一行会是一样的,就会有问题!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo2vec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值