LeetCode 397. 整数替换(递归 贪心)
文章目录
- 1. 题目
- 2. 解题
- 2.1 递归
- 2.2 记忆化递归
- 2.3 贪心
1. 题目
给定一个正整数 n,你可以做如下操作:
- 如果 n 是偶数,则用 n / 2替换 n。
- 如果 n 是奇数,则可以用 n + 1或n - 1替换 n。
n 变为 1 所需的最小替换次数是多少?
示例 1:
输入:
8
输出:
3
解释:
8 -> 4 -> 2 -> 1示例 2:
输入:
7
输出:
4
解释:
7 -> 8 -> 4 -> 2 -> 1
或
7 -> 6 -> 3 -> 2 -> 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-replacement
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 递归
class Solution {public:int integerReplacement(int n) {if(n == 1)return 0;if(n == 2147483647)//防止+1溢出return 32;if(n%2 == 0)return 1+integerReplacement(n>>1);elsereturn 1+min(integerReplacement(n+1), integerReplacement(n-1));}
};
2.2 记忆化递归
class Solution {unordered_map<int,int> map;
public:int integerReplacement(int n) {if(n == 1)return 0;if(n == 2147483647)//防止+1溢出return 32;if(map.find(n) != map.end())return map[n];int m;if(n%2 == 0)m = 1+integerReplacement(n>>1);elsem = 1+min(integerReplacement(n+1), integerReplacement(n-1));map[n] = m;return m;}
};
2.3 贪心
偶数的时候没什么选择,直接除以2
奇数的时候,怎么选择?+1,-1 ?(操作后肯定为偶数,2的倍数)
为了让数更快的等于1,更优的操作是,操作后还为4的倍数,就可以连续除以2两次
class Solution {public:int integerReplacement(int n) {int count = 0;if(n == INT_MAX)return 32;while(n != 1){if((n&1) == 0)//偶数{++count;n >>= 1;}else//奇数有两种情况0b01, 0b11{if(n == 3)//特殊情况{count += 2;break;}if((n&3) == 3)n += 1;//操作后可以多除1次2elsen -= 1;++count;}}return count;}
};
LeetCode 397. 整数替换(递归 贪心)相关推荐
- LeetCode 397. 整数替换(Integer Replacement)
题目描述: 给定一个正整数 n,你可以做如下操作: 1. 如果 n 是偶数,则用 n / 2替换 n. 2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n. n 变为 1 所需的最小替换 ...
- leetcode 397 整数替换
https://leetcode-cn.com/problems/integer-replacement/ 题目 给定一个正整数nnn ,你可以做如下操作: 如果nnn是偶数,则用n/2n / 2n/ ...
- leetcode 397. Integer Replacement | 397. 整数替换(动态规划,记忆化搜搜)
题目 https://leetcode.com/problems/integer-replacement/ 题解 一开始写了个 dp,结果因为大数组 OOM 了. dp 数组需要计算每一个值,有的值是 ...
- 文巾解题 397. 整数替换
1 题目描述 2 解题思路 2.1 递归 class Solution:def integerReplacement(self, n: int) -> int:if(n==1):return 0 ...
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
- 【LeetCode】LeetCode之跳跃游戏——动态规划+贪心算法
[LeetCode]LeetCode之打家劫舍[暴力递归.动态规划.动态规划之优化空间的具体分析与实现] https://blog.csdn.net/Kevinnsm/article/details/ ...
- 整数划分递归相关问题
算法设计----整数划分递归相关问题 一.原问题 整数划分,是指把一个正整数n写成如下形式: 假设整数n,能被划分为i段n=a1+a2+...ai,其中ak为n中划分的最大整数(1<=ak< ...
- [模拟|数位] leetcode 7 整数反转
[模拟|数位] leetcode 7 整数反转 1.题目 题目链接 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输 ...
- Leetcode 648.单词替换(Replace Words)
Leetcode 648.单词替换 1 题目描述(Leetcode题目链接) 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词( ...
最新文章
- 《Learning Scrapy》(中文版)第11章 Scrapyd分布式抓取和实时分析
- 子frame获取外部元素
- 1分钟、2束光,3D打印出一座“柏林地标”,精度高于发丝 | Nature
- iOS Mach异常和signal信号
- dev.c drv.c bus.c
- 为什么外链建设要灵活多变呢?
- 商用密码产品认证-智能密码钥匙
- 制造业数字化转型-项目案例合集
- 关于O、Θ、Ω、o、ω等数学符号
- Tackling High Dimensional Nonseparable Optimization Problems By CCPSO
- Arduino UNO u8glib显示中文-亲测可用
- 【API】开源免费接口管理
- 二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式
- Oracle总结【视图、索引、事务、用户权限、批量操作】
- 如何注册微软Azure并获取语音合成服务?
- Prometheus由于时间不同步导致数据不显示
- winxp/win7开机密码忘记有妙招
- 全国各地土特产一览表(以后好问朋友要礼物了)
- 网页中保存的密码查看方法
- vb读取mysql多表,vb获取数据库中所有表的名称