[397] 整数替换

发布时间 2024-01-10 19:19:34作者: WTSRUVF
CategoryDifficultyLikesDislikes
algorithms Medium (42.34%) 298 -
Tags

 

Companies

 

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

  1. 如果 n 是偶数,则用 n / 2替换 n 
  2. 如果 n 是奇数,则可以用 n + 1n - 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)的方法,因为每次都是除以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