刷题笔记Day27:贪心算法part01
贪心算法的核心思想:多个局部最优给出全局最优。(如果没有办法证伪则证明可以使用这个方法推出最优解)
题目:分发饼干
455. 分发饼干 - 力扣(LeetCode)
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。
示例 1:- 输入: g = [1,2,3], s = [1,1]
- 输出: 1
- 解释:
- 你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。
- 虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。
- 所以你应该输出 1。
复制代码 思路:本体的我才用的思路是使用双指针的方式来同时在两个数组之间对比,若满足小孩的胃口走两个指针同时向右移;若不能满足小孩的胃口,则只有代表饼干数组的指针往右移。需要注意的是需要是一个从小到大排列的有序数组。- class Solution {
- public:
- int findContentChildren(vector<int>& g, vector<int>& s) {
- sort(g.begin(),g.end());
- sort(s.begin(),s.end());
- int left = 0;
- int count = 0;
- for(int right = 0;right<s.size();right++)
- {
- if(left >= g.size())
- {
- break;
- }
- if(g[left] <= s[right])
- {
- count ++;
- left ++;
- }
- }
- return count;
- }
- };
复制代码 题目:最大子数组和
53. 最大子数组和 - 力扣(LeetCode)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
示例 1:- 输入:nums = [1,7,4,9,2,5]
- 输出:6
- 解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3) 。
复制代码 贪心思路:只要我们在搜索过程中子串的和大于零则继续往后搜索,因为只要大于零说明此刻的子串是起着对和的增大作用的,若小于零说明此刻的子串对子串和起着变小的作用。- 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;
- }
- }
- return result;
- }
- };
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |