C++ LeetCode 贪心算法专题
2020-04-27 07:18
866 查看
文章目录
定义
贪心法:遵循某种规律,不断贪心地选取当前最优策略的算法设计方法。
LeetCode 455.Assign Cookies
难度:Easy
若一块饼干可满足一个较小的孩子或一个较大的孩子,随便给谁,都不会影响最终结果。但胃口小的孩子更加容易满足,所以优先满足较小的孩子。
若一个孩子可以用一块小饼干满足,也可用一块大饼干满足,那就没必要用大饼干满足孩子,大饼干可以用来满足更大需求的孩子。
class Solution { public: int findContentChildren(vector<int>& g, vector<int>& s) { std::sort(g.begin(),g.end()); std::sort(s.begin(),s.end()); int child=0; int cookies=0; while(child<g.size()&&cookies<s.size()){ if(g[child]<=s[cookies]){ child++; } cookies++; } return child; } };
LeetCode 376.Wiggle Subsequence
难度:Medium
方法一:状态机
class Solution { public: int wiggleMaxLength(vector<int>& nums) { if(nums.size()<2){ return nums.size(); } static const int begin=0; static const int up=1; static const int down=2; int max_length=1; int status=begin; for(int i=1;i<nums.size();i++){ switch(status){ case begin: if(nums[i]-nums[i-1]>0){ status=up; max_length++; } else if(nums[i]-nums[i-1]<0){ status=down; max_length++; } break; case up: if(nums[i]-nums[i-1]<0){ status=down; max_length++; } break; case down: if(nums[i]-nums[i-1]>0){ status=up; max_length++; } break; } } return max_length; } };
方法二:动态规划
class Solution { public: int wiggleMaxLength(vector<int>& nums) { if(nums.size()<2){ return nums.size(); } int flag=0; int size_nums=nums.size(); int dp[size_nums]={0}; if(nums[0]==nums[1]){ flag=0; dp[0]=1; dp[1]=1; } else if(nums[0]>nums[1]){ flag=-1; dp[0]=1; dp[1]=2; } else if(nums[0]<nums[1]){ flag=1; dp[0]=1; dp[1]=2; } for(int i=2;i<size_nums;i++){ if(flag==0){ if(nums[i]-nums[i-1]<0){ flag=-1; dp[i]=dp[i-1]+1; } else if(nums[i]-nums[i-1]>0){ flag=1; dp[i]=dp[i-1]+1; } else { dp[i]=dp[i-1]; } } else if(flag==1){ if(nums[i]-nums[i-1]<0){ flag=-1; dp[i]=dp[i-1]+1; } else { dp[i]=dp[i-1]; } } else if(flag==-1){ if(nums[i]-nums[i-1]>0){ flag=1; dp[i]=dp[i-1]+1; } else { dp[i]=dp[i-1]; } } } return dp[size_nums-1]; } };
LeetCode 402. Remove K Digits
难度:Medium
将vector当作是一个可遍历的栈。
class Solution { public: string removeKdigits(string num, int k) { std::vector<int>s; for(int i=0;i<num.length();i++){ int temp_num=num[i]-'0'; while(s.size()!=0&&s[s.size()-1]>temp_num&&k>0){ s.pop_back(); k--; } if(temp_num!=0||s.size()!=0){ s.push_back(temp_num); } } while(k&&s.size()){ s.pop_back(); k--; } std::string result=""; for(int i=0;i<s.size();i++){ result.append(1,'0'+s[i]); } if(result==""){ return "0"; } return result; } };
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 数据结构与算法之贪心算法 C++实现
- LeetCode(初级算法)数组篇--存在重复c++
- leetcode初级算法 —— 1.2 宝石与石头 C++
- 贪心算法之埃及分数问题(附c++源代码)
- 算法练习专题——LeetCode系列之 ThreeSum
- c++算法设计:贪心算法
- 贪心算法专题复习
- 【Leetcode】算法总结—贪心
- Leetcode Linked List Random Node C++(蓄水池抽样算法)
- 【算法专题】工欲善其事必先利其器—— C++ STL中vector(向量/不定长数组)的常用方法总结
- LeetCode(初级算法)数组篇--只出现一次的数字c++
- [LeetCode] 贪心算法之 Patching Array
- 贪心算法专题总结
- 贪心算法专题总结
- LeetCode——561. Array Partition I(贪心,C++)
- 贪心转载专题之:贪心算法介绍
- 贪心算法专题小结——区间相关问题
- LeetCode(初级算法)数组篇--两个数组的交集II c++
- LeetCode:382. Linked List Random Node(蓄水池抽样算法C++)
- Leetcode题解——算法思想之贪心思想