【代码随想录算法训练营】第31天 | 第八章 贪心(一)+ 复习第2天 第一章 数组(二)

本文介绍了四种编程挑战:第455题分发饼干的贪心策略,通过模拟解决;第376题摆动序列的思路在于维护区间波动;第53题最大子序和采用贪心和动态规划两种方法;还有数组题目复习,如有序数组平方、长度最小子数组和螺旋矩阵II的实现。
摘要由CSDN通过智能技术生成

主要内容

贪心题目

455.分发饼干

思路分析

直接模拟

代码

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g = sorted(g)
        s = sorted(s)
        gl, sl = len(g), len(s)
        i, j = 0, 0
        while i < gl and j < sl:
            if s[j] < g[i]:
                j += 1
            else:
                i += 1
                j += 1
        return i

376. 摆动序列

思路分析

保持区间波动,只需要把单调区间上的元素移除就可以了。

代码

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        prediff = 0
        result = 1
        for i in range(1, len(nums)):
            curdiff = nums[i] - nums[i - 1]
            # 找波峰、波谷
            if (curdiff > 0 and prediff <= 0) or (curdiff < 0 and prediff >= 0):
                prediff = curdiff
                result += 1
        return result

53. 最大子序和

思路分析

代码

class Solution:
    # 贪心算法,遇到子和为负数,立马舍弃
    def maxSubArray(self, nums: List[int]) -> int:
        result = -float('inf')
        count = 0
        for num in nums:
            count += num
            if count > result:
                result = count
            if count <= 0:
                count = 0
        return result
class Solution:
    # 动态规划
    def maxSubArray(self, nums: List[int]) -> int:
        dp = [-float('inf')] * len(nums)
        dp[0] = nums[0]
        for i in range(1, len(nums)):
            dp[i] = max(dp[i-1]+nums[i], nums[i])
        return max(dp)

数组题目(复习)

977.有序数组的平方

思路分析

代码

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        res = [0] * len(nums)
        i, j = 0, len(nums) - 1
        index = len(nums) - 1
        while i <= j:
            if nums[i] * nums[i] > nums[j] * nums[j]:
                res[index] = nums[i] * nums[i]
                i += 1
            else:
                res[index] = nums[j] * nums[j]
                j -= 1
            index -= 1
        return res

209.长度最小的子数组

思路分析

滑动窗口,终点一直动,当满足和>target后,起点动

代码

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        if not nums:
            return 0
        # 看有没有被更新过
        res = len(nums) + 1
        i = j = 0
        total = 0
        while j < len(nums):
            total += nums[j]
            j += 1
            while total >= target:
                res = min(res, j - i)
                total -= nums[i]
                i += 1
        if res == len(nums) + 1:
            return 0
        else:
            return res

59.螺旋矩阵II

思路分析

上右下左顺序填充

代码

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        # 返回结果
        res = [[0]*n for _ in range(n)]
        # 填充的数
        r = 1
        # 左闭右闭
        start, end = 0, n-1
        while start < end and r < n*n:
            # 上
            for j in range(start, end):
                res[start][j] = r
                r += 1
            # 右
            for i in range(start, end):
                res[i][end] = r
                r += 1
            # 下
            for j in range(end,start,-1):
                res[end][j] = r
                r += 1
            # 左
            for i in range(end,start,-1):
                res[i][start] = r
                r += 1

            start += 1
            end -= 1
       
        # 奇数
        if n % 2:
            res[n//2][n//2] = n*n
            
        return res    
算法训练营主要涵盖了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题,题目要求在给定的数组中找到长度最小的子数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值