Skip to content

Latest commit

 

History

History
66 lines (56 loc) · 1.64 KB

File metadata and controls

66 lines (56 loc) · 1.64 KB

397. 整数替换

给定一个正整数 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
or 7 -> 6 -> 3 -> 2 -> 1

示例 3:

输入: n = 4
输出: 2

提示:

  • 1 <= n <= 231 - 1

题解 (Rust)

1. 广度优先搜索

use std::collections::HashSet;
use std::collections::VecDeque;

impl Solution {
    pub fn integer_replacement(n: i32) -> i32 {
        let mut nums = vec![(n as i64, 0)].into_iter().collect::<VecDeque<_>>();
        let mut seen = vec![n as i64].into_iter().collect::<HashSet<_>>();

        while let Some((x, y)) = nums.pop_front() {
            if x == 1 {
                return y;
            }
            if x % 2 == 0 && !seen.contains(&(x / 2)) {
                nums.push_back((x / 2, y + 1));
                seen.insert(x / 2);
            } else if x % 2 == 1 {
                if !seen.contains(&(x + 1)) {
                    nums.push_back((x + 1, y + 1));
                    seen.insert(x + 1);
                }
                if !seen.contains(&(x - 1)) {
                    nums.push_back((x - 1, y + 1));
                    seen.insert(x - 1);
                }
            }
        }

        0
    }
}