当前位置:   article > 正文

贪心算法总结(3)

贪心算法总结(3)

一、最长回文串

409. 最长回文串 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. int longestPalindrome(string s) {
  4. int hash[127]={0};
  5. for(char&ch:s) ++hash[ch];
  6. int ret=0;
  7. for(int&x:hash) ret+=x/2*2; //技巧1 利用向下取整
  8. return ret<s.size()?ret+1:ret;
  9. }
  10. };

二、增减字符串匹配

942. 增减字符串匹配 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. vector<int> diStringMatch(string s) {
  4. //如果是升 就把最小的放进去 如果是降 就把最大的放进去
  5. int left=0,right=s.size();
  6. vector<int> ret;
  7. ret.reserve(s.size()+1);
  8. for(auto&ch:s)
  9. if(ch=='I') ret.emplace_back(left++);
  10. else ret.emplace_back(right--);
  11. ret.emplace_back(left);
  12. return ret;
  13. }
  14. };

三、重构字符串

767. 重构字符串 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. string reorganizeString(string s) {
  4. int hash[26]={0};
  5. int n=s.size(),maxcount=0,maxchar=' ';
  6. for(auto&ch:s)
  7. if(maxcount<++hash[ch-'a']) maxcount=hash[ch-'a'],maxchar=ch;
  8. //先处理最多的那个
  9. if(maxcount>(n+1)/2) return "";
  10. string ret(n,' ');
  11. int index=0;
  12. for(int i=0;i<maxcount;++i)
  13. {
  14. ret[index]=maxchar;
  15. index+=2;
  16. }
  17. hash[maxchar-'a']=0;
  18. for(int i=0;i<26;++i)
  19. for(int j=0;j<hash[i];++j)
  20. {
  21. if(index>=n) index=1;
  22. ret[index]='a'+i;
  23. index+=2;
  24. }
  25. return ret;
  26. }
  27. };

四、最优除法

553. 最优除法 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. string optimalDivision(vector<int>& nums) {
  4. int n=nums.size();
  5. if(n==1) return to_string(nums[0]);
  6. if(n==2) return to_string(nums[0])+"/"+to_string(nums[1]);
  7. string ret=to_string(nums[0])+"/("+to_string(nums[1]);
  8. for(int i=2;i<n;++i) ret+="/"+to_string(nums[i]);
  9. ret+=")";
  10. return ret;
  11. }
  12. };

 五、单调递增的数字

738. 单调递增的数字 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. //要获取一个数的数位关系的时候 一般有两个技巧,第一个是变成字符串 第二个就是/10 %10
  4. int monotoneIncreasingDigits(int n) {
  5. //根据贪心策略,首先第一步我们要找到第一个下降的数,然后让他-1 之后再把后面所有的数都变成9
  6. //但是比如12345555123这种情况。就需要进行回退 回退到第一个5的位置然后再进行上面的操作
  7. string s=to_string(n);
  8. int m=s.size(),i=0;
  9. while(i+1<n&&s[i]<=s[i+1]) ++i; //找到第一个下降趋势的
  10. if(i==m-1) return n;//可能直接走到头了
  11. //如果没有走到头,开始回退
  12. while(i-1>=0&&s[i]==s[i-1]) --i;
  13. --s[i];
  14. //然后让后面的位置变成9
  15. for(int j=i+1;j<m;++j) s[j]='9';
  16. return stoi(s);
  17. }
  18. };

六、坏了的计算机

991. 坏了的计算器 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. int brokenCalc(int startValue, int target) {
  4. int ret=0;
  5. while(target>startValue)
  6. {
  7. if(target%2) ++target;
  8. else target/=2;
  9. ++ret;
  10. }
  11. return ret+startValue-target;
  12. }
  13. };

七、整数替换

397. 整数替换 - 力扣(LeetCode)

 解法1:递归+记忆化搜索

  1. class Solution {
  2. public:
  3. unordered_map<int,int> hash;
  4. int integerReplacement(int n) {
  5. return dfs(n);
  6. }
  7. int dfs(long n) //细节问题 容易溢出
  8. {
  9. //模拟 递归 记忆化搜索
  10. if(hash.count(n)) return hash[n];
  11. if(n==1) return hash[1]=0;
  12. else if(n%2) return hash[n]=1+min(dfs(n-1),dfs(n+1));
  13. else return hash[n]=dfs(n/2)+1;
  14. }
  15. };

解法2:贪心

  1. class Solution {
  2. public:
  3. int integerReplacement(int n) {
  4. int ret=0;
  5. while(n>1)
  6. {
  7. if(n%2==0) n/=2,++ret;
  8. else
  9. {
  10. if(n==3) n=1;
  11. else if(n%4==1) n/=2;
  12. else n=n/2+1;
  13. ret+=2;
  14. }
  15. }
  16. return ret;
  17. }
  18. };

八、可被三数整除的最大和

1262. 可被三整除的最大和 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. int maxSumDivThree(vector<int>& nums) {
  4. // 正难则反
  5. //sum%3==0
  6. //sum%3==1 x1 或者y1y2
  7. //sum%3==2 x1x2或者y1
  8. const int INF=0x3f3f3f3f;
  9. int sum=0,x1=INF,x2=INF,y1=INF,y2=INF;
  10. for(auto&e:nums)
  11. {
  12. sum+=e;
  13. if(e%3==1)
  14. {
  15. if(e<x1) x2=x1,x1=e;
  16. else if(e<x2) x2=e;
  17. }
  18. else if(e%3==2)
  19. {
  20. if(e<y1) y2=y1,y1=e;
  21. else if(e<y2) y2=e;
  22. }
  23. }
  24. if(sum%3==0) return sum;
  25. else if(sum%3==1) return max(sum-x1,sum-y1-y2);
  26. else return max(sum-x1-x2,sum-y1);
  27. }
  28. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/970818
推荐阅读
相关标签
  

闽ICP备14008679号