
初篇我们介绍了贪心算法的相关背景知识,本篇我们将结合具体题目,进一步深化大家对于贪心算法的理解和运用。
回文串的长度。区分大小写由于可以任意调换顺序,因此只要同一个字符出现的次数为偶数次,一定可以进行对称回文。故具体步骤如下:
class Solution {
public:
int longestPalindrome(string s) {
int hash[127];
for(auto ch :s) hash[ch]++;
int len=s.size();
int ret=0;
for(int x :hash)
{
ret+=x/2*2;//偶数直接对称,奇数舍去一个
}
return ret<len?ret+1:ret;//最终再判断是否需要补一个奇数串作为中点
}
};任何一个 。即要求返回一个[0,n]的序列,对应长度为n的字符串,要求满足其对应匹配规则。
回想之前的波峰波谷类型,可以采用相似的方法进行处理:
class Solution {
public:
vector<int> diStringMatch(string s) {
int n=s.size();
vector<int> ret;
int left=0,right=n;//left表示小数,right表示大数
for(auto ch :s)
{
if(ch=='I') ret.push_back(left++);//选取最小的
else ret.push_back(right--);//选取最大的
}
ret.push_back(left);
return ret;
}
};观察样例可知,饼干数目可能小于孩子数目,因此我们可以沿用田忌赛马的思路。
从⼩到⼤挑选饼⼲:
i. 如果当前饼⼲能满⾜,直接喂(最⼩的饼⼲都能满⾜,不要浪费⼤饼⼲);
ii. 如果当前饼⼲不能满⾜,放弃这个饼⼲,去检测下⼀个饼⼲(这个饼⼲连最⼩胃⼝的孩⼦都⽆法满⾜,更别提那些胃⼝⼤的孩⼦了)。class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int m=g.size(),n=s.size();
//排序
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int ret=0;//最大数目
int i=0,j=0;
while(i<m && j<n)
{
//可以满足
if(s[j]>=g[i])
{
j++;
ret++;
i++;//更新下标
}
else
{
j++;
}
}
return ret;
}
};整数将进行浮点除法。任意位置添加任意数目的括号,来改变算数的优先级字符串格式返回具有最大值的对应表达式。由于括号的添加位置和添加数量都是任意的,因此问题就转化为了求最大数除以最小数
贪⼼策略:
class Solution {
public:
string optimalDivision(vector<int>& nums) {
int n=nums.size();
string ret;
if(n==1)
{
return to_string(nums[0]);
}
if(n==2)
return to_string(nums[0])+'/'+to_string(nums[1]);
ret+=to_string(nums[0])+"/("+to_string(nums[1]);
for(int i=2;i<n;i++)
{
ret+='/'+to_string(nums[i]);
}//全部存储在分子内
ret+=')';
return ret;
}
};本篇关于贪心算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!