代码随想录训练营第二天

有序数组的平方(leetcode977)

  1. 最简单方法,先对数组内部元素平方,再通过sorted函数进行排序

class Solution:
    def SortedSquares(self, nums: List[int]) -> List[int]:
        return sorted(num ** 2 for num in nums)

时间复杂度

O(n + nlogn)

双指针法

思路

  1. 定义一个新的空数组,长度与原数组相等。result = [];

  1. 考虑到原数组存在负数,可能负数平方后反而成为数组中最大值,且这个最大值不是在数组的最左闭,就是最右边;

  1. 新的数组由大到小更新,所以下标也应该由大到小更新,索引下标 k = len(nums) - 1;

  1. 定义两个下标 i = 0, j = len(nums) - 1 , 当 i <= j 时,循环终止,注意: 如果仅判断 i < j, 就结束循环,会导致中间数据还没取到就返回数据;

  1. 判断 nums[i] * nums[i] > nums[j] * nums[j],更新result[k] = nums[i] * nums[i] , k -= 1, i += 1; 当 nums[i] * nums[i] = nums[j] * nums[j],与大于结果相同;

  1. 判断,小于情况, result[k] = nums[j] * nums[j] k -= 1, j -= 1

代码实现

class Solution:
    def SortedQuard(self, nums):
        i, j, k = 0, len(nums) - 1, len(nums) - 1
        result = []
        result = [-1] * len(nums)
        while i <= j:
            if nums[i] ** 2 > nums[j] ** 2:
                result[k] = nums[i] ** 2
                i += 1
            else:
                result[k] = nums[j] ** 2
                j -= 1
            k -= 1
        return result

时间复杂度

O(n)

长度最小的子数组(leetcode209)

思路

滑动窗口

就是不断的调节子序列起始位置终止位置,从而得出我们要想的结果。

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?

  • 如何移动窗口的起始位置?

  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。j 为终止位置,i = 0 为起始位置 并且 i 动态移动;

for j in range(len(nums)):

sum += nums[ j ] # 收集滑动窗口中的和

当滑动窗口内的和大于目标值时,i 向前 移动

注意:while 不能写if 否则,代码会一直判断,直至得到sum < tarket 时,滑动窗口的区域,而不是最小区域。

while sum >= tarket:

滑动窗口的长度:subl = j - i + 1

result = float("inf") # 初始定义无限大

滑动窗口长度:定义的最大值与当前获取到的subl间最小值

result = min(result, subl)

当i向后移动以为,sum的值应该-nums [i], i += 1

代码实现

class Solution:
    def minSubArrayLen(self, tarket: int, nums: List[int]) -> int:
        i = 0  # 初始位置 0 
        _sum = 0  # 滑动窗口内的值
        res = float("inf")  # 定义最大值
        for j in range(len(nums)):
            _sum += nums[j]
            while _sum >= tarket:
                subl = j - i + 1 # 滑动窗口长度
                res = min(res, subl) # 在最大长度与滑动窗口的长度的最小值
                _sum -= nums[i]
                i += 1    # 满足条件,初始位置向前移动1
           return res if res != float("inf") else 0 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,使得子数组的和大于等于给定的目标值。这里可以使用滑动窗口的方法来解决问题。使用两个指针来表示滑动窗口的左边界和右边界,通过移动指针来调整滑动窗口的大小,使得滑动窗口中的元素的和满足题目要求。具体实现的代码如下: ```python def minSubArrayLen(self, target: int, nums: List[int]) -> int: left = 0 right = 0 ans = float('inf') total = 0 while right < len(nums): total += nums[right] while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1 right += 1 return ans if ans != float('inf') else 0 ``` 以上就是第二十二天的算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值