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

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;
    }
};
相关推荐
晒太羊的猫24 分钟前
hot100子串
java·算法·leetcode
小豆庄1 小时前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程
海清河晏1111 小时前
加油站问题
数据结构·算法·leetcode
GG.WinGel1 小时前
质数数目(蓝桥杯练习题)
java·数据结构·算法·青少年编程·蓝桥杯
艾iYYY1 小时前
进程的状态
算法
秋天的怀念_David2 小时前
算法一千零一夜 · 第十七夜 长街点灯
java·程序人生·算法
CV爱数码2 小时前
论文精读|RED-CNN:残差编解码网络,低剂量 CT 去噪的经典基线
网络·人工智能·算法·cnn·ct·重建·x-ray
JustNow_Man2 小时前
【Harness】本地文本向量化搜索解决方案--qmd
git·python·算法
敲代码的苦132 小时前
头歌 数据结构—消防资源调度
数据结构·算法
布莱克6052 小时前
C++ 中 set 与 map 的区别详解
开发语言·c++·算法·哈希