Leetcode 397 整数替换
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 397 整数替换相关的知识,希望对你有一定的参考价值。
地址 https://leetcode-cn.com/problems/integer-replacement/
给定一个正整数 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
解答
目前就是 暴力dfs。
其实可以反过来想,1经过加倍和加1减1 如何经过最小操作得到指定数字
暴力代码如下
class Solution { public: int dfs(long long n ) { if(n==1) return 0; if(n%2 == 0){ cout << 0 << endl; return dfs(n>>1)+1; }else{ cout << 1<< endl; //单数 int ret = min(dfs(n+1),dfs(n-1)); return ret+1; } } int integerReplacement(int n) { return dfs(n); } };
添加哈希 做了记忆化 加速效果明显
class Solution { public: unordered_map<long long , int> memo; int dfs(long long n ) { if (memo.count(n)) return memo[n]; if(n==1) return 0; if(n%2 == 0){ int ret = dfs(n>>1); memo[n] = ret+1; return ret+1; }else{ //单数 int ret = min(dfs(n+1),dfs(n-1)); memo[n] = ret+1; return ret+1; } } int integerReplacement(int n) { int res = dfs(n); memo[n] = res; return res; } };
以上是关于Leetcode 397 整数替换的主要内容,如果未能解决你的问题,请参考以下文章