[Algorithm][贪心][最长回文串][增减字符串匹配][分发饼干][最优除法][跳跃游戏Ⅱ]详细讲解


1.最长回文串

1.题目链接


2.代码实现

int longestPalindrome(string s) 
{
    int hash[128] = {0};
    for(const auto& ch : s)
    {
        hash[ch]++;
    }

    int ret = 0;
    for(const auto& x : hash)
    {
        ret += x / 2 * 2; // 奇偶混合处理
    }

    return ret < s.size() ? ret + 1 : ret;
}

2.增减字符串匹配

1.题目链接


2,算法原理详解

  • 贪心
    • 当遇到I:选择当前最小的那个数
    • 当遇到D:选择当前最大的那个数

3.代码实现

vector<int> diStringMatch(string s) 
{
    int left = 0, right = s.size();

    vector<int> ret;
    for(const auto& ch : s)
    {
        if(ch == 'I')
        {
            ret.push_back(left++);
        }
        else
        {
            ret.push_back(right--);
        }
    }
    ret.push_back(left);

    return ret;
}

3.分发饼干

1.题目链接


2.算法原理详解

  • 预处理:排序
  • 贪心:针对当前胃口最小的孩子,挑选饼干
    • 能满足,直接喂
    • 不能满足,直接删掉这个饼干
      请添加图片描述

3.代码实现

int findContentChildren(vector<int>& g, vector<int>& s) 
{
    sort(g.begin(), g.end());
    sort(s.begin(), s.end());

    int ret = 0, n = g.size(), m = s.size();
    for(int i = 0, j = 0; i < n && j < m; i++, j++)
    {
        while(j < m && s[j] < g[i])
        {
            j++;
        }

        if(j < m)
        {
            ret++;
        }
    }

    return ret;
}

4.最优除法

1.题目链接


2.算法原理详解

  • 贪心:除了前两个数以外,其余的数全放在分子上即可
    请添加图片描述

3.代码实现

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 ret = to_string(nums[0]) + "/(" + to_string(nums[1]);
    for(int i = 2; i < n; i++)
    {
        ret += "/" + to_string(nums[i]);
    }
    ret += ")";

    return ret;
}

5.跳跃游戏 II

1.题目链接


2.算法原理详解

  • 贪心:类似层序遍历的过程
    请添加图片描述

3.代码实现

int jump(vector<int>& nums) 
{
    int left = 0, right = 0, maxPos = 0, ret = 0, n = nums.size();
    while(left <= right)
    {
        if(maxPos >= n - 1)
        {
            return ret;
        }

		// 遍历当前层,更新下一层最右端点
        for(int i = left; i <= right; i++)
        {
            maxPos = max(maxPos, nums[i] + i);
        }
        left = right + 1;
        right = maxPos;
        ret++;
    }

    return -1; // 跳不到的情况
}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值