397.整数替换
Posted yaggy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了397.整数替换相关的知识,希望对你有一定的参考价值。
题目描述:
给定一个正整数 n,你可以做如下操作:
1. 如果 n 是偶数,则用 n / 2替换 n。
2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n。
问:
n 变为 1 所需的最小替换次数是多少?
可见,该题的难点在于n是奇数时,应该是n+1还是n-1。
解法一:递归
当n==1时,return 0;
将int型的值传给m时,需要将m的类型申明为long long型。因为如果int 型的n为2147483647时,m=(n+1)/2的过程中n+1就会溢出。
int, long int都是4个字节的有符号数,最大值为2147483647.
可以将int型的实参传递给long long型的形参。
class Solution public: int integerReplacement(long long n) if(n==1) return 0; else if(n%2==0) return 1+integerReplacement(n/2); else long long m=n+1; return 2+min(integerReplacement(m/2),integerReplacement((n-1)/2)); ;
解法2:利用位运算
1 class Solution 2 public: 3 int integerReplacement(long long n) 4 int res=0; 5 while(n>3) 6 7 if(n%2) 8 9 n>>=1; 10 if(n%2) 11 12 n++; 13 //res++; 14 15 res+=2; 16 //这一个if判断语句中包含了两种情况,举个例子:110111 首先初次判断为奇数,右移一位,相当于-1,再除以2 这时候res=2,n=011011,再次判断为奇数,+1,n=011100 这个结果与最初的n=110111先加1n=111000再右移1位是一样的n=011100 所以这样的操作以后res+=2; 17 //倘若最开始的n=1101,那么初次判断以后为奇数,-1,/2,此时n=0110就不用再进行加1操作了
//(n-1)/2 +1 ==(n+1)/2
18 else 19 20 n>>=1; 21 res++; 22 23 24 return res+n-1; 25 26 ;
这道题有一定的技巧,感觉时间是在O(1)(菜鸡瞎猜的,这道题感觉是个脑力题,不仅要求对位运算熟悉,还要求要对整数的二进制表示很熟悉,在leetcode上击败了100%的c++用户,在时间上)
以上是关于397.整数替换的主要内容,如果未能解决你的问题,请参考以下文章