您的位置:首页 > 编程语言 > C语言/C++

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;
}
};
  • 点赞
  • 收藏
  • 分享
  • 文章举报
Gotclue 发布了5 篇原创文章 · 获赞 0 · 访问量 142 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: