贪心算法(三)

目录

一、k次取反后最大化的数组和

二、优势洗牌

三、最长回文串

四、增减字符串匹配


一、k次取反后最大化的数组和

k次取反后最大化的数组和

贪心策略:

解题代码:

cpp 复制代码
class Solution 
{
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) 
    {
        int m = 0;
        int min_elec = INT_MAX;
        for(auto& x:nums)
        {
            if(x < 0)
                m++;
            min_elec = min(min_elec, abs(x));
        }

        sort(nums.begin(), nums.end());
        int ret = 0;
        if(m > k)
        {
            for(int i = 0; i < nums.size(); i++)
            {
                if(i < k)
                {
                    ret += -nums[i];
                    continue;
                }
                ret += nums[i];
            }
        }
        else
        {
            for(auto& x : nums)
                ret += abs(x);

            if((k-m) % 2)
                ret -= 2*min_elec;
        }
        return ret;
    }
};

二、优势洗牌

优势洗牌

引例:田忌赛马

田忌赛马的故事,我相信大家都知道。赛马的要求就是:上等马对上等马,中等马对中等马,下等马对下等马。因为齐王的上中下等马,都依次比田忌的上中下等马好一些,所以无论怎么比,田忌都无法获胜。

而孙膑给田忌出了个注意:田忌的下等马对齐王的上等马,中等马对下等马,上等马对中等马。这样,虽然齐王的上等马对田忌的下等马是场碾压式的胜利,可是另外两场,田忌都可以获胜。总的来说,就是田忌获胜了。

而我们这道题的贪心策略就可以从田忌赛马中获得启发。

贪心策略:

我们根据示例二来模拟一下解题过程。

我们需要先对数组进行排序。贪心策略对于田忌赛马的思想运用,就是对于同一位置来说,如果nums1的值小于nums2的值, 那么我们就拿nums1的值去匹配nums2中没有被匹配元素的最大元素。

解题代码:

cpp 复制代码
class Solution 
{
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) 
    {
        int m = nums1.size();
        sort(nums1.begin(), nums1.end());

        vector<int> index(m);
        for(int i = 0; i < m; i++)
            index[i] = i;
        sort(index.begin(), index.end(), [&](int i, int j){
            return nums2[i] < nums2[j];
        });

        vector<int> ret(m);
        int left = 0, right = m-1;
        for(auto& x:nums1)
        {
            if(x <= nums2[index[left]])
            {
                ret[index[right]] = x;
                right--;
            }
            else if(x > nums2[index[left]])
            {
                ret[index[left]] = x;
                left++;
            }
        }
        return ret;
    }
};

三、最长回文串

最长回文串

贪心策略:

1、先统计字符串s中,各个字符的个数。

2、如果某个字符的个数是偶数,那么所有的这个字符都可以去构成回文串。

3、如果有字符的个数是奇数,那么可以选择其中一个字符放在中间,如下:

注:设一个字符个数为x,那么该字符可以构成回文串的个数为 x / 2 * 2。

解题代码:

cpp 复制代码
class Solution 
{
public:
    int longestPalindrome(string s) 
    {
        int hash[127] = {0};
        for(auto& e:s)
            hash[e]++;

        int len = 0;
        for(int i = 0; i < 127; i++)
            len += hash[i] / 2 * 2;

        return len == s.size() ? len : len+1;
    }
};

四、增减字符串匹配

增减字符串匹配

贪心策略:

1、当遇到 'I',选择当前能够选择的最小的数。

2、当遇到 'D',选择当前能够选择的最大的数。

解题代码:

cpp 复制代码
class Solution 
{
public:
    vector<int> diStringMatch(string s) 
    {
        int n = s.size();
        vector<int> ret;
        int left = 0, right = n;
        for(auto& e : s)
        {
            if(e == 'I')
                ret.push_back(left++);
            else
                ret.push_back(right--);
        }
        ret.push_back(left);

        return ret;
    }
};
相关推荐
AI科技星1 天前
ELN 升级:π 级数自动生成器全域数理架构
大数据·人工智能·python·算法·金融
强盛机器学习~1 天前
2026年SCI一区新算法-傅里叶变换优化算法(FTO)-公式原理详解与性能测评 Matlab代码免费获取
算法·matlab·进化计算·群体智能·傅里叶变换·元启发式算法
王老师青少年编程1 天前
csp信奥赛C++高频考点专项训练之贪心算法 --【跳跃与过河问题】:过河问题
c++·算法·贪心·csp·信奥赛·跳跃与过河问题·过河问题
沉默-_-1 天前
备战蓝桥杯-哈希
c++·学习·算法·蓝桥杯·哈希算法
拼好饭和她皆失1 天前
基础算法--写给算法小白的模板指南:快速掌握核心代码,蓝桥杯必备模板
算法
吞下星星的少年·-·1 天前
rotate函数应用模板
算法
AI科技星1 天前
人类首张【全域数学公理体系】黑洞内部结构图—基于「0-1-∞」三元本源的全维深度解析
人工智能·算法·机器学习·数学建模·数据挖掘·量子计算
paeamecium1 天前
【PAT甲级真题】- Recover the Smallest Number (30)
数据结构·算法·pat考试·pat
Dillon Dong1 天前
【风电控制】变流器转矩控制回路深度解析:从指令生成到闭环控制
算法·变流器·风电控制
玛丽莲茼蒿1 天前
Leetcode hot100 在排序数组中查找元素的第一个和最后一个位置【中等】
数据结构·算法