文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 递归
    • 2.2 记忆化递归
    • 2.3 贪心

1. 题目

给定一个正整数 n,你可以做如下操作:

  1. 如果 n 是偶数,则用 n / 2替换 n。
  2. 如果 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. 整数替换(递归 贪心)相关推荐

  1. LeetCode 397. 整数替换(Integer Replacement)

    题目描述: 给定一个正整数 n,你可以做如下操作: 1. 如果 n 是偶数,则用 n / 2替换 n. 2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n. n 变为 1 所需的最小替换 ...

  2. leetcode 397 整数替换

    https://leetcode-cn.com/problems/integer-replacement/ 题目 给定一个正整数nnn ,你可以做如下操作: 如果nnn是偶数,则用n/2n / 2n/ ...

  3. leetcode 397. Integer Replacement | 397. 整数替换(动态规划,记忆化搜搜)

    题目 https://leetcode.com/problems/integer-replacement/ 题解 一开始写了个 dp,结果因为大数组 OOM 了. dp 数组需要计算每一个值,有的值是 ...

  4. 文巾解题 397. 整数替换

    1 题目描述 2 解题思路 2.1 递归 class Solution:def integerReplacement(self, n: int) -> int:if(n==1):return 0 ...

  5. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  6. 【LeetCode】LeetCode之跳跃游戏——动态规划+贪心算法

    [LeetCode]LeetCode之打家劫舍[暴力递归.动态规划.动态规划之优化空间的具体分析与实现] https://blog.csdn.net/Kevinnsm/article/details/ ...

  7. 整数划分递归相关问题

    算法设计----整数划分递归相关问题 一.原问题 整数划分,是指把一个正整数n写成如下形式: 假设整数n,能被划分为i段n=a1+a2+...ai,其中ak为n中划分的最大整数(1<=ak< ...

  8. [模拟|数位] leetcode 7 整数反转

    [模拟|数位] leetcode 7 整数反转 1.题目 题目链接 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输 ...

  9. Leetcode 648.单词替换(Replace Words)

    Leetcode 648.单词替换 1 题目描述(Leetcode题目链接)   在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词( ...

最新文章

  1. 《Learning Scrapy》(中文版)第11章 Scrapyd分布式抓取和实时分析
  2. 子frame获取外部元素
  3. 1分钟、2束光,3D打印出一座“柏林地标”,精度高于发丝 | Nature
  4. iOS Mach异常和signal信号
  5. dev.c drv.c bus.c
  6. 为什么外链建设要灵活多变呢?
  7. 商用密码产品认证-智能密码钥匙
  8. 制造业数字化转型-项目案例合集
  9. 关于O、Θ、Ω、o、ω等数学符号
  10. Tackling High Dimensional Nonseparable Optimization Problems By CCPSO
  11. Arduino UNO u8glib显示中文-亲测可用
  12. 【API】开源免费接口管理
  13. 二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式
  14. Oracle总结【视图、索引、事务、用户权限、批量操作】
  15. 如何注册微软Azure并获取语音合成服务?
  16. Prometheus由于时间不同步导致数据不显示
  17. winxp/win7开机密码忘记有妙招
  18. 全国各地土特产一览表(以后好问朋友要礼物了)
  19. 网页中保存的密码查看方法
  20. vb读取mysql多表,vb获取数据库中所有表的名称

热门文章

  1. AJAX-服务器响应
  2. 前端小插件之手写js循环滚动特效
  3. 51nod 1379 索函数
  4. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
  5. linux tar order
  6. js定时器和linux命令locate
  7. 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信
  8. google Chrome 浏览器源码地址地址!
  9. C++类中成员变量的初始化总结
  10. 字符串2在字符串1中第一次出现的位置strstr()