欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > [贪心算法]最长回文串 增减字符串匹配 分发饼干

[贪心算法]最长回文串 增减字符串匹配 分发饼干

2025/3/29 3:37:22 来源:https://blog.csdn.net/m0_73802195/article/details/146428856  浏览:    关键词:[贪心算法]最长回文串 增减字符串匹配 分发饼干

1.最长回文串

在这里插入图片描述

我们可以存下每个字母的个数,然后分类讨论

  1. 如果是奇数就减一加到结果中
  2. 如果是偶数就直接加入即可
    最后判断长度跟原字符串的差距,如果小于原数组说明有奇数结果+1
class Solution {
public:int longestPalindrome(string s) {int ret=0;//1.计数int hash[127]={0};for(char ch:s)  hash[ch]++;//2.统计结果for(int x:hash){ret+=x/2*2;}return ret<s.size() ? ret+1 :ret;}
};

2.增减字符串匹配

在这里插入图片描述

  • 如果是I说明数字是递增的,贪心就体现在把最小的数字放在这个,因为不论后面放什么数字都一定会是递增的
  • 如果是D说明数字在递减,同理把最大的数字放在这即可。
    所以我们使用left和right来标记数组的最大和最小即可
class Solution {
public:vector<int> diStringMatch(string s) {int left=0,right=s.size();vector<int> ret;for(auto ch:s){if(ch=='I')ret.push_back(left++);elseret.push_back(right--);}ret.push_back(left);return ret;}
};

3.分发饼干

在这里插入图片描述

我们先对这两个数组排序,然后就按照田忌赛马的思路,如果最小的可以满足就直接给最小的,然后向后继续寻找即可。
也就是:两个指针,找到最小能满足孩子的饼干,不能就直接++

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());//两个指针,找到最小能满足孩子的饼干,不能就直接++int ret=0,m=g.size(),n=s.size();for(int i=0,j=0;i<m && j<n;i++,j++){while(j<n&& g[i]>s[j])//这个是循环,直到找到合适的饼干为止{j++;}if(j<n){ret++;}}return ret;}
};

4.跳跃游戏Ⅱ

在这里插入图片描述
在这里插入图片描述

用left和righ控制跳跃的空间,left=right+1 right就是每次跳跃的最大距离

class Solution {
public:int jump(vector<int>& nums) {int count=0;int n=nums.size();int left=0,right=0;int maxn=0;while(left<=right){if(maxn>=n-1)return count;for(int i=left;i<=right;i++)//找出区间内最大的数及其下标的和{maxn=max(maxn,nums[i]+i);}left=right+1;right=maxn;count++;}return -1;}
};

5.跳跃游戏

在这里插入图片描述
这里把上题的返回值修改一下即可

class Solution {
public:bool canJump(vector<int>& nums) {int count = 0;int n = nums.size();int left = 0, right = 0;int maxn = 0;while (left <= right) {if (maxn >= n - 1)return true;for (int i = left; i <= right;i++) // 找出区间内最大的数及其下标的和{maxn = max(maxn, nums[i] + i);}left = right + 1;right = maxn;count++;}return false;}
};

6.最优除法

在这里插入图片描述

根据除除为乘,我们只需要把b到最后这段区间的数字优先处理,就可以让分子变为最大,分母最小

class Solution {
public:string optimalDivision(vector<int>& nums) {int n=nums.size();if(n==1){return to_string(nums[0]);}if(n==2){return to_string(nums[0])+"/"+to_string(nums[1]);}string str=to_string(nums[0])+"/("+to_string(nums[1]);for(int i=2;i<n;i++){str+="/";str+=to_string(nums[i]);}str+=")";return str;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词