给定整数N ,任务是通过执行以下操作最少次数将N的值减小为0 :
- 翻转N的二进制表示形式中最右边的(第0)位。
- 如果(I – 1)位被设置,然后翻转第i位和选自(i – 2)清除所有位到第0个比特。
例子:
Input: N = 3
Output: 2
Explanation:
The binary representation of N (= 3) is 11
Since 0th bit in binary representation of N(= 3) is set, flipping the 1st bit of binary representation of N modifies N to 1(01).
Flipping the rightmost bit of binary representation of N(=1) modifies N to 0(00).
Therefore, the required output is 2
Input: N = 4
Output: 7
方法:可以根据以下观察结果解决问题:
1 -> 0 => 1
10 -> 11 -> 01 -> 00 => 2 + 1 = 3
100 -> 101 -> 111 -> 110 -> 010 -> … => 4 + 2 + 1 = 7
1000 -> 1001 -> 1011 -> 1010 -> 1110 -> 1111 -> 1101 -> 1100 -> 0100 -> … => 8 + 7 = 15
Therefore, for N = 2N total (2(N + 1) – 1) operations required.
If N is not a power of 2, then the recurrence relation is:
MinOp(N) = MinOp((1 << cntBit) – 1) – MinOp(N – (1 << (cntBit – 1)))
cntBit = total count of bits in binary representation of N.
MinOp(N) denotes minimum count of operations required to reduce N to 0.
请按照以下步骤解决问题:
- 使用log 2 (N)+1计算N的二进制表示形式的位数。
- 使用上述递归关系,计算将N减少为0所需的最小操作数。
下面是上述方法的实现。
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to find the minimum count of
// operations required to Reduce N to 0
int MinOp(int N)
{
if (N <= 1)
return N;
// Stores count of
// bits in N
int bit = log2(N) + 1;
// Recurrence relation
return ((1 << bit) - 1)
- MinOp(N - (1 << (bit - 1)));
}
// Driver Code
int main()
{
int N = 4;
cout << MinOp(N);
return 0;
}
Java
// Java program to implement
// the above approach
class GFG{
// Function to find the minimum count of
// operations required to Reduce N to 0
public static int MinOp(int N)
{
if (N <= 1)
return N;
// Stores count of
// bits in N
int bit = (int)(Math.log(N) /
Math.log(2)) + 1;
// Recurrence relation
return ((1 << bit) - 1) - MinOp(
N - (1 << (bit - 1)));
}
// Driver code
public static void main(String[] args)
{
int N = 4;
System.out.println(MinOp(N));
}
}
// This code is contributed by divyeshrabadiya07
Python3
# Python program to implement
# the above approach
# Function to find the minimum count of
# operations required to Reduce N to 0
import math
def MinOp(N):
if (N <= 1):
return N;
# Stores count of
# bits in N
bit = (int)(math.log(N) / math.log(2)) + 1;
# Recurrence relation
return ((1 << bit) - 1) - MinOp(N - (1 << (bit - 1)));
# Driver code
if __name__ == '__main__':
N = 4;
print(MinOp(N));
# This code is contributed by 29AjayKumar
C#
// C# program to implement
// the above approach
using System;
class GFG{
// Function to find the minimum count of
// operations required to Reduce N to 0
public static int MinOp(int N)
{
if (N <= 1)
return N;
// Stores count of
// bits in N
int bit = (int)(Math.Log(N) /
Math.Log(2)) + 1;
// Recurrence relation
return ((1 << bit) - 1) - MinOp(
N - (1 << (bit - 1)));
}
// Driver code
public static void Main()
{
int N = 4;
Console.WriteLine(MinOp(N));
}
}
// This code is contributed by sanjoy_62
7
时间复杂度: O(log(N))
辅助空间: O(1)