代码随想录2|数组-双指针/滑动窗口/转圈逻辑

977 有序数组的平方

问题描述:给定一个有序数组,返回这个数组中元素平方的排序

解决思路1:先平方,快排-时间复杂度为O(nlogn)

解决思路2:双指针的思想

如何能够想到双指针的思想:平方之后最大元素一定是在两边,所以可以用两个指针逐步向中间靠拢的过程来实现排序,中心思路是先更新最大,再更新次大的元素。

# 首先定义一个数组存放排序后的数据
result = list(range(0,len(nums))
k = numsize
i,j = 0,len(nums)-1
# 分别判断将那个位置上的数值更新在result列表中
while k>=0:
    if nums[j]**2 > num[i]**2:
        result[k] = nums[j]**2
        j -= 1
    else:
        result[k] = nums[i]**2
        i += 1
return temp

209 长度最小的子数组

问题描述:已知一个数组取出这个数组中,最小的数组,加和需要大于nums的值

解决思路1【暴力解法】分别遍历所有的组合最终找到长度最小的组合。

解决思路2【滑动窗口】

滑动窗口的思路:起始位置如何移动是滑动窗口中的核心思路,

①定义需要维护的变量,②定义窗口首末端,③更新需要维护的变量,④移动相应的指针

left = 0
right = 0
sum_ = 0
min_len = math.inf
# 终止条件为右端的指针需要小于数组的长度
while right<=len(nums):
    sum_ += nums[right]
    while sum_ > target:
        min_len = min(right-start+1,min_len)
        sum_ -= nums[left]
        left += 1
    right += 1
return min_len

 相关题目:

904思路:哈希表+滑动窗口

59 螺旋矩阵II

注意:四个点的边界条件

循环不变量的原则:对每条边的处理规则是不变的,转一圈坚持的一个原则

        top = 0
        bottom = n-1
        left = 0
        right = n-1
        i,j = 0,0
        count = 1
        temp = [[0 for i in range(n)] for i in range(n)]

        while count<=n**2:
            # left to right,将角落的值放在上一步进行处理
            for j in range(left,right+1,1):
                temp[i][j] = count
                count += 1
            top += 1
            # top to bottom 
            for i in range(top,bottom+1,1):
                temp[i][j] = count
                count += 1
            right -= 1
            for j in range(right,left-1,-1):
                temp[i][j] = count
                count += 1
            bottom -= 1
            for i in range(bottom,top-1,-1):
                temp[i][j] = count
                count += 1
            left += 1
        return temp

总结:

  • 二分法:查找元素的下标
  • 双指针:删除元素、规律排序
  • 滑动窗口:需要设置初始的变量,后续根据窗口的值对变量值进行更新
  • 模拟方法:通过设定边界条件达到最优值,找到循环不变量(左闭右闭,还是左闭右开,到底要不要先对上一步的数据进行处理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值