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

文章目录

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;
    }
相关推荐
北域码匠9 小时前
SHA-1算法:安全哈希原理与应用解析
算法·c#·哈希算法
有点。11 小时前
C++(贪心算法一)
c++·贪心算法
xinhuanjieyi12 小时前
html修复游戏种太阳错误
前端·游戏·html
魔士于安14 小时前
unity 音乐会场景 unity2022
游戏·unity·游戏引擎·贴图·模型
码来的小朋友17 小时前
[python] 我开发了一个有20个关卡随机地图的迷宫游戏
python·游戏·pygame
不羁的木木17 小时前
《HarmonyOS 6.1 新能力实战之智感握姿》第四篇:进阶应用——横屏游戏手柄模式
游戏·华为·harmonyos
Swift社区18 小时前
鸿蒙游戏Runtime解析:Store如何驱动整个游戏世界?
游戏·华为·harmonyos
jushi899919 小时前
修复电脑常见运行库问题 DirectX 组件状态、运行库、DLL 游戏常见运行库 DirectX 修复工具增强版
游戏·电脑
Swift社区20 小时前
鸿蒙游戏为什么掉帧?60FPS性能优化实战指南
游戏·性能优化·harmonyos
码云骑士20 小时前
05-Python字典底层原理-Hash表与有序性的真相
开发语言·python·哈希算法