代码随想录算法训练营第31天| 理论基础 |455.分发饼干 | 376. 摆动序列 |53. 最大子序和

代码随想录算法训练营第31天| 理论基础 |455.分发饼干 | 376. 摆动序列 |53. 最大子序和

第八章 贪心算法 part01

贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。

不用花心思去研究其规律, 没有思路就立刻看题解。

基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。

学完贪心之后再去看动态规划,就会了解贪心和动规的区别。

详细布置

理论基础

https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

455.分发饼干

https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());//先都排序保证数组的有序
        sort(s.begin(),s.end());
        int result=0;
        int index=s.size()-1;//从后来满足最大容量的匹配
        

        for(int i=g.size()-1;i>=0;i--)
        {
                if(index>=0&&s[index]>=g[i])//保证匹配eg:s.size()=0
                {
                    result++;
                    index--;
                }
//其中i是固定的,从后最大胃口来匹配最大饼干,若最大饼干不匹配当前胃口,就是胃口的问题
//好理解就是最近比较有名的话,你不做有的是人做。你吃不饱(所以就不吃了(咋就闹上脾气了?((恼)),有的是人吃的饱。
                
        }
        return result;

    }
};

376. 摆动序列

https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size()<=1)return nums.size();
        int curdiff=0;// 当前一对差值
        int prediff=0;// 前一对差值
        int result=1; // 记录峰值个数,序列默认序列最右边有一个峰值
        for(int i=0;i<nums.size()-1;i++)
        {
            curdiff=nums[i+1]-nums[i];
                        // 出现峰值

            if((prediff<=0&&curdiff>0)||(prediff>=0&&curdiff<0))
            {
                result++;
                prediff=curdiff;// 注意这里,只在摆动变化的时候更新prediff
            }


        }
        return result;
    }
};

53. 最大子序和

https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=INT32_MIN;
        int count=0;


        for(int i=0;i<nums.size();i++)
        {
            count+=nums[i];
            if(count>result)result=count;// 取区间累计的最大值(相当于不断确定最大子序终止位置)
            if(count<0) count=0;// 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
            
        }

    return result;}
};
  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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题,题目要求在给定的数组中找到长度最小的子数组,

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值