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

1.最长回文串

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

  1. 如果是奇数就减一加到结果中
  2. 如果是偶数就直接加入即可
    最后判断长度跟原字符串的差距,如果小于原数组说明有奇数结果+1
cpp 复制代码
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来标记数组的最大和最小即可
cpp 复制代码
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++);
            else
                ret.push_back(right--);
        }
        ret.push_back(left);
        return ret;
    }
};

3.分发饼干

我们先对这两个数组排序,然后就按照田忌赛马的思路,如果最小的可以满足就直接给最小的,然后向后继续寻找即可。

也就是:两个指针,找到最小能满足孩子的饼干,不能就直接++

cpp 复制代码
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就是每次跳跃的最大距离

cpp 复制代码
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.跳跃游戏

这里把上题的返回值修改一下即可

cpp 复制代码
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到最后这段区间的数字优先处理,就可以让分子变为最大,分母最小

cpp 复制代码
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;
    }
};
相关推荐
土司大王10 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_9622186110 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.11 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
wzdark12 小时前
基于启发式搜索的最优路径规划算法研究4
算法
l1t12 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
a1879272183112 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
2601_9583529013 小时前
还要写 AEC 算法?0 代码 + 6 个引脚,F-18 让通话清晰度提升 300%
人工智能·算法·降噪消回音
happyprince13 小时前
03-regmix-深刻观-哲学与升华
算法
一路向阳~负责的男人13 小时前
运动控制算法收录
算法
czt_java13 小时前
5个核心位运算公式
算法