求从M到N的最少操作次数(三种操作)及同类贪心算法问题咨询
嘿,结合你提到的「从正整数M通过加1、减1、乘2操作得到N的最少步数」问题,以及LeetCode 991的贪心解法思路,下面这些同类问题都适合用贪心算法来解决——它们的核心共性是每一步做局部最优选择,就能导向全局最优解,且满足贪心算法生效的两个关键条件:贪心选择性质、最优子结构。
扩展版整数变换最小步数问题
比如原问题的变种:允许的操作新增「除以2(仅当数值为偶数时)」「乘3」等,这类问题可以通过逆推法用贪心解决——从N往M反向推导,每一步选择当前最接近M的操作(比如N是奇数时先调整为偶数,再除以2;如果N远大于M,优先除以2而非减1),每一步的局部最优选择最终能得到最少操作次数,和LeetCode 991的思路完全一致。规则面额的硬币找零问题
当硬币面额是「标准规则」的(比如美式硬币[1,5,10,25]),要找最少硬币数时,每次优先选最大面额的硬币来凑金额,就能得到全局最优解。这类问题和你的原问题类似,都是通过每一步的最优选择来最小化操作次数/硬币数量。跳跃游戏II(最少跳跃次数)
给定一个数组,每个元素代表当前位置可跳跃的最大长度,求到达最后一个位置的最少跳跃次数。这里的贪心策略是:在当前能到达的范围内,选择能跳得最远的位置作为下一步的目标,每一步的局部最优选择能让我们用最少的跳跃次数到达终点,和你的「最少操作次数」目标逻辑一致。环形加油站问题
环形路上有N个加油站,每个站有固定油量,到下一站需要消耗一定油量,求能绕一圈的起始加油站。贪心策略是:如果当前累计油量不足以走到下一站,就从下一站重新开始计算,同时记录总油量是否足够支撑一圈——每一步的局部调整能快速定位到全局可行的起点,避免了暴力枚举的高复杂度。字符串拼接最大数问题
给定一组非负整数,将它们拼接成最大的数(比如[3,30,34,5,9]拼成9534330)。这里的贪心策略是:每次比较两个数a和b的拼接结果(a+bvsb+a),选择更大的组合放在前面,通过每一步的局部最优选择,最终得到全局最大的拼接结果,和数值变换类的贪心思路同源。
内容的提问来源于stack exchange,提问作者Andy

