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

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;
    }
};
相关推荐
Tisfy11 分钟前
LeetCode 2110.股票平滑下跌阶段的数目:数学(一次遍历)
数学·算法·leetcode·题解
1024小神11 分钟前
swift中 列表、字典、集合、元祖 常用的方法
数据结构·算法·swift
ULTRA??13 分钟前
Informed RRT*实现椭圆启发式采样
c++·算法
Swizard14 分钟前
告别样本不平衡噩梦:Focal Loss 让你的模型学会“划重点”
算法·ai·训练
亭台33 分钟前
【Matlab笔记_23】MATLAB的工具包m_map的m_image和m_pcolor区别
笔记·算法·matlab
李玮豪Jimmy34 分钟前
Day39:动态规划part12(115.不同的子序列、583.两个字符串的删除操作、72.编辑距离)
算法·动态规划
历程里程碑1 小时前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
星辞树2 小时前
从 In-context Learning 到 RLHF:大语言模型的范式跃迁
算法
再__努力1点2 小时前
【68】颜色直方图详解与Python实现
开发语言·图像处理·人工智能·python·算法·计算机视觉
mingchen_peng2 小时前
第一章 初识智能体
算法