代码随想录打卡第二天|977.有序数组,209.长度最小的子数组,59.螺旋矩阵

文章介绍了作者在刷题过程中使用双指针解决的三个问题:有序数组的平方计算、长度最小子数组和螺旋矩阵II。通过实例展示了如何运用双指针优化算法,降低时间复杂度,以及循环不变量在解决这些问题中的关键作用。
摘要由CSDN通过智能技术生成

前言

        刷题的第二天,准确来说是第三天了,因为已经过了十二点。今天有点拖延,直到下午才学,所以没有看拓展题。刷题时也没能静下心来,但好歹还是完成了基本任务。

        还是有些基本语法没熟悉,比如python的定义数组等 

977.有序数组

代码随想录

思路:因为昨天学了双指针,所以今天这道题就直接用双指针做出来了。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l=0
        r=len(nums)-1
        i=len(nums)-1
        res=[float('inf')]*len(nums)#数组定义方式
        while l<=r:
            if nums[l]**2<nums[r]**2:
                res[i]=nums[r]**2
                r-=1
            else:
                res[i]=nums[l]**2
                l+=1
            i-=1
        return res
        
        

 注意:

  1. res的定义方式,内部数据类型,长度
  2. 指针定义在两端是因为,使得平方的最大值一定在两端而不在中间,因为原先就是有序数组
  3. while l<=r是因为要把数组所有元素都遍历完
  4. https://code-thinking.cdn.bcebos.com/gifs/977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.gif

209.长度最小的子数组 

代码随想录

思路:暴力算法超时

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = len(nums)
        min_len = float('inf')
        
        for i in range(l):
            cur_sum = 0
            for j in range(i, l):
                cur_sum += nums[j]
                if cur_sum >= s:
                    min_len = min(min_len, j - i + 1)
                    break
        
        return min_len if min_len != float('inf') else 0#全新写法值得注意,如果min_len无限制
                                                        #则表示全部加起来都比s小,故返回0

 滑动窗口(其实也是双指针)

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l = len(nums)
        min_len = float('inf')
        start=0
        end=0
        cur_sum=0
        
        while end<l:
            cur_sum+=nums[end]
            while cur_sum>=target:
                
                min_len=min(end-start+1,min_len)               
                cur_sum-=nums[start]
                start+=1
            end+=1
        return min_len if min_len!=float('inf') else 0#注意是返回min_len

总结:主要看起始位置start的位置是如何移动的,O(n^2)暴力解法降为O(n)

59.螺旋矩阵II

代码随想录

思路:确定循环不变量

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums=[[0]*n for _ in range(n)]#创建一个n行n列的数组
        startx=0#起始点
        starty=0
        count=1#用来给每一个空格赋值
        for offset in range(1,(n//2)+1):
            for i in range(starty,n-offset):#左闭右开,从左往右
                nums[startx][i]=count
                count+=1
            for i in range(startx,n-offset):
                nums[i][n-offset]=count
                count+=1
            for i in range(n-offset,starty,-1):#从右往左
                nums[n - offset][i] = count
                count += 1
            for i in range(n - offset, startx, -1): # 从下至上
                nums[i][starty] = count
                count += 1             
            startx+=1
            starty+=1
            

        if n%2!=0:#n为奇数时,n的平方为中心点,也为数组的中间的中间位置
            nums[n//2][n//2]=n**2
        return nums

 举例子:注:横为x,纵为y

n=3,第一个for,【【1,2,0】,【0,0,0】,【0,0,0】】

                        第二个for,offset=1【【1,2,3】【0,0,4】【0,0,0】】,之后依次类推

而求解本题依然是要坚持循环不变量原则。

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

注意n为奇数的情况

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值