zoukankan      html  css  js  c++  java
  • LeetCode-Integer Replacement

    Given a positive integer n and you can do operations as follow:

    1. If n is even, replace n with n/2.
    2. If n is odd, you can replace n with either n + 1 or n - 1.

    What is the minimum number of replacements needed for n to become 1?

    Example 1:

    Input:
    8
    
    Output:
    3
    
    Explanation:
    8 -> 4 -> 2 -> 1
    

    Example 2:

    Input:
    7
    
    Output:
    4
    
    Explanation:
    7 -> 8 -> 4 -> 2 -> 1
    or
    7 -> 6 -> 3 -> 2 -> 1

    Solution:
    public class Solution {
        public int integerReplacement(int n) {
            if (n<1) return -1;
            
            int steps = 0;
            while (n!=1){
                if (n%2==0){
                    n /= 2;
                } else {
                    // We have: steps(2x) <= steps(2x-1) && steps(2x) <= steps(2x+1),i.e.,
                    // for odd number, we go to (n-1) if (n-1)/2 is an even number. 
                    // IMPORTANT: the only exception is n=3, for which we should choose n-1,because (n-1)/2 is 1 directly.
                    // NOTE: We need take care of n==Integer.MAX_VALUE, in which we cannot perform n+1.
                    if (n==Integer.MAX_VALUE){
                        n = n/2+1;
                        steps++;
                    } else if (((n-1)/2)%2==0 || (n-1)/2==1){
                        n = n-1;
                    } else {
                        n = n+1;
                    }
                }
                steps++;
            }
            return steps;
        }
    }

  • 相关阅读:
    使用 star UML制作的图
    评价片段
    项目部分
    用新学的知识 写了一段小代码
    常用系统存储过程
    考试小总结
    分页
    行转列面试题 事例
    子查询
    生成验证码的方法集合(一)
  • 原文地址:https://www.cnblogs.com/lishiblog/p/5867232.html
Copyright © 2011-2022 走看看