【贪心算法】最长回文串,增减字符串匹配,分发饼干,最优除法,跳跃游戏

文章目录

1. 最长回文串(LC 409)

最长回文串

题目描述

解题思路

统计每个字符的个数,如果是偶数直接拼接,如果是奇数,取出偶数部分再拼接,如果最后剩余一个字符,再拼接到中间

代码实现

java 复制代码
public int longestPalindrome(String s) {
        int n = s.length();
        int ret = 0;
        int[] hash = new int[127];
        for(int i=0;i<n;i++)
            hash[s.charAt(i)-'A']++;

        for(int a:hash)
            ret+= a/2*2;
        
        return ret<n?ret+1:ret;
    }

2. 增减字符串匹配(LC 942)

增减字符串匹配

题目描述

翻译:在字符串对应位置填入【0,n】,符合字符串的增或降的要求

解题思路

增的位置从小往大填,降的位置从大往小填

代码实现

java 复制代码
public int[] diStringMatch(String s) {
        int n = s.length();
        char[] ss = s.toCharArray();
        int[] ret = new int[n+1];

        int ics = 0;
        int d = n;
        for(int i = 0;i<n;i++){
            if(ss[i]=='I'){
                ret[i] = ics;
                ics++;
            }else{
                ret[i] = d;
                d--;
            }
        }
        ret[n] = ics;
        return ret;
    }

3. 分发饼干(LC 455)

分发饼干

题目描述

解题思路

类似优势洗牌

  1. 对两个数组进行排序
  2. 定义两个指针分别遍历两个数组,如果饼干能满足,计数器自增;否则就跳过,判断下一个饼干

代码实现

java 复制代码
public int findContentChildren(int[] g, int[] s) {
        int n1 = g.length;
        int n2 = s.length;
 
        Arrays.sort(g);
        Arrays.sort(s);
        int ret = 0;

        int i=0, j = 0;
        while(i<n1 && j<n2){
            if(g[i]<=s[j]){
                i++;
                j++;
                ret++;
            }else
                j++;
        }
        return ret;
    }

4. 最优除法(LC 553)

最优除法

题目描述

解题思路

  1. 经过一系列计算,这个表达式最终都可以写成x/y的形式,只需要让x尽可能大,y
    尽可能小
  2. nums0前没有符号,一定在分子部分;nums1前有除号,一定在分母部分,只需要给num1及后面数字一个括号,内部的除号就可以转化成乘号

代码实现

java 复制代码
public String optimalDivision(int[] nums) {
        int n = nums.length;
        if(n==1)
            return nums[0]+"";
        if(n==2)
            return nums[0]+"/"+nums[1];
            
        StringBuilder ret = new StringBuilder();
        ret.append(nums[0]+"/(");
        for(int i = 1;i<n;i++)
            ret.append(nums[i]+"/");
        ret.deleteCharAt(ret.length()-1);
        ret.append(")");
        return ret.toString();
    }

5. 跳跃游戏II(LC 45)

跳跃游戏II

题目描述

解题思路

动态规划

  • 状态表示:dpi表示到第i个位置最小跳跃次数
  • 状态转移方程:dpi+arri>=i 则 dpi = dpj+1,取最小值
  • 初始化:dp0 = 0,其余位置初始化为无穷大

贪心策略

类似层序遍历,找到每一次跳跃的左端点和右端点,如果哦前一次次的右端点大于当前的左端点,就直接覆盖,这里提现了贪心策略,尽可能减少跳跃次数

代码实现

  • 动态规划
java 复制代码
public int jump(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        Arrays.fill(dp,0x3f3f3f3f);
        dp[0] = 0;
        for(int i = 1;i<n;i++){
            for(int j = 0;j<n;j++){
                if(j+nums[j]>=i)
                    dp[i] = Math.min(dp[i],dp[j]+1);
            }
        }
        return dp[n-1];
    }
  • 贪心策略
java 复制代码
public int jump(int[] nums) {
        int n = nums.length;
        int ret = 0; 
        int left = 0;
        int right = 0;
        int maxpos = 0;
        while(true){
            if(maxpos>=n-1)
                return ret;

            for(int i = left;i<=right;i++)
                maxpos = Math.max(maxpos,nums[i]+i);
            ret++;
            left = right+1;
            right = maxpos;
            
        }
    }

6. 跳跃游戏(LC 55)

跳跃游戏

题目描述

解题思路

与上一题的思路相同,只需要判断最后left和right能否相遇

代码实现

java 复制代码
public boolean canJump(int[] nums) {
        int n = nums.length;
        int left = 0;
        int right = 0;
        int maxpos = 0;
        int ret = 0;
        
        while(left<=right){
            if(maxpos>=n-1)
                return true;
            for(int i= left;i<=right;i++)
                maxpos = Math.max(maxpos,nums[i]+i);
            left = right+1;
            right = maxpos;
        }
        return false;
    }
相关推荐
noipp2 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
金銀銅鐵7 小时前
[Python] 用 turtle 来绘制国际象棋棋盘(不含棋子)
python·游戏
jinyishu_8 小时前
哈希表原理与开放定址法C++实现
c++·哈希算法·散列表
Python私教10 小时前
Godot怎么下载和安装?零基础完成第一次启动
人工智能·游戏·godot
FairGuard手游加固1 天前
2026年7月份国产游戏审批信息
游戏
闪电悠米1 天前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠1 天前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
中国搜索直付通1 天前
棋牌游戏支付与防沉迷:二级商户如何构建“免疫系统”
游戏
2601_962924761 天前
遗忘之海手游战术家怎么玩 遗忘之海手游战术家玩法攻略
游戏
雅客李1 天前
2026年第三季度云手机实测 游戏多开挂机托管三维度数据公开
游戏·智能手机