[397] 整数替换
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Medium (42.34%) | 298 | - |
Companies
给定一个正整数 n
,你可以做如下操作:
- 如果
n
是偶数,则用n / 2
替换n
。 - 如果
n
是奇数,则可以用n + 1
或n - 1
替换n
。
返回 n
变为 1
所需的 最小替换次数 。
示例 1:
输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1
示例 2:
输入:n = 7
输出:4
解释:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1
示例 3:
输入:n = 4
输出:2
提示:
1 <= n <= 231 - 1
解析:
看数量级,用O(1)或者 O(log n)的方法,因为每次都是除以2和 + 1或- 1轮流进行,所以直接dfs,又考虑2的k次方可以减少dfs次数,
所以在dfs之前先记录一下2的k次方
/* * @lc app=leetcode.cn id=397 lang=cpp * * [397] 整数替换 */ // @lc code=start class Solution { public: unordered_map<std::string, int> vis; void dfs(long long n, int k, int &min_value) { if (n == 1) { min_value = min(k, min_value); return; } if (n < 1) { return; } if (vis.find(to_string(n)) != vis.end()) { min_value = min(min_value, k + vis[to_string(n)]); return; } if (n % 2 == 0) { dfs(n / 2, k + 1, min_value); } else { dfs(n + 1, k + 1, min_value); dfs(n - 1, k + 1, min_value); } } int integerReplacement(int n) { long long res = 1; for (int i = 1; i < 32; i++) { res *= 2; vis[to_string(res)] = i; } int min_value = 100000000; dfs(n, 0, min_value); return min_value; } }; // @lc code=end
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。