力扣刷题Day 2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

977.有序数组的平方

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

笔记

  1. 由于数组包含负数,那么平方之后较大的数一定是在数组两端的,平方后数值由大到小的顺序是从数组两端往中间收的,可以使用双指针从两端往中间收,每次比较两个指针位置的值平方后的大小,把大的值存到新数组,对应的指针往内移。
  2. 题目要求新数组也是非降序,那么存值的时候可以从后往前存,设置一个变量表示新数组的下标。新数组的下标范围和原数组是一样的,那么最大的值就先存到数组的[len(nums)-1]号位置,也就是新数组下标变量的初始值为[len(nums)-1],每存一个值就把下标值减一

Python代码

调用python排序函数sorted,时间复杂度为O(nlogn)

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        return sorted(pow(x, 2) for x in nums)  

使用双指针实现,时间复杂度为O(n)

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        k =  len(nums)-1  #结果数组的下标变量
        ans = [0]*len(nums)          #结果数组
        

        i, j = 0, len(nums)-1  #左右双指针
        while (i <= j):   #当i=j,两指针指向最后一个元素的时候,也要进循环
            if pow(nums[i], 2) < pow(nums[j], 2):
                ans[k] = pow(nums[j], 2)
                j -= 1
                k -=1
            else:    #若pow(nums[i], 2) = pow(nums[j], 2),随便移动ij其中一个指针都可
                ans[k] = pow(nums[i], 2)
                i += 1
                k -= 1
        return ans


209.长度最小的子数组

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

笔记

  1. 看到连续子数组,用双指针
  2. 要求和,定义一个变量add
  3. 要返回满足条件的最小子数组长度,维护一个变量ans表示最小长度,每次更新取min,初始化为一个不可能的比较大的值n+1
  4. 当满足子数组和大于等于target后,移动左指针,把和减去左边的元素,左指针右移,继续循环判断和是否满足条件,直到和不满足条件后出循环,回到外层右指针右移的循环
  5. 注意处理特殊情况,找不到的时候满足条件子数组的时候返回0

Python代码

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        ans = len(nums) + 1  #满足条件子数组的最小长度,每次取min
        add = 0      #子数组和
        i = 0
        for j in range(len(nums)):
            add += nums[j]
            while add >= target:
                ans = min(ans, j-i+1)
                add -= nums[i]
                i += 1
        return ans if ans != len(nums)+1 else 0


59.螺旋矩阵II

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

笔记

  1. 每次移了边界之后判断,如果边界不符合条件则退出循环
  2. 不要复制,一个一个的写,复制容易忘记修改导致出错

Python代码

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        left, right = 0, n-1  #列,闭区间
        up, down = 0, n-1     #行
        matrix = [[0]*n for _ in range(n)]  
        k = 1
        while True:
            #从左往右遍历
            for i in range(left, right+1):
                matrix[up][i] = k
                k += 1
            up += 1  #上边界下移
            if up > down:
                break

            #从上往下遍历
            for i in range(up, down+1):
                matrix[i][right] = k
                k += 1
            right -= 1  #右边界左移
            if right < left:
                break

            #从右往左遍历
            for i in range(right,left-1,-1):
                matrix[down][i] = k
                k += 1
            down -= 1   #下边界上移
            if down < up:
                break

            # 从下往上遍历
            for i in range(down, up-1, -1):
                matrix[i][left] = k
                k += 1
            left += 1 #左边界右移
            if left > right:
                break

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值