Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/2571.html

2571. Minimum Operations to Reduce an Integer to 0

Description

You are given a positive integer n, you can do the following operation any number of times:

  • Add or subtract a power of 2 from n.

Return the minimum number of operations to make n equal to 0.

A number x is power of 2 if x == 2i where i >= 0.

 

Example 1:

Input: n = 39
Output: 3
Explanation: We can do the following operations:
- Add 20 = 1 to n, so now n = 40.
- Subtract 23 = 8 from n, so now n = 32.
- Subtract 25 = 32 from n, so now n = 0.
It can be shown that 3 is the minimum number of operations we need to make n equal to 0.

Example 2:

Input: n = 54
Output: 3
Explanation: We can do the following operations:
- Add 21 = 2 to n, so now n = 56.
- Add 23 = 8 to n, so now n = 64.
- Subtract 26 = 64 from n, so now n = 0.
So the minimum number of operations is 3.

 

Constraints:

  • 1 <= n <= 105

Solutions

  • class Solution {
        public int minOperations(int n) {
            int ans = 0, cnt = 0;
            for (; n > 0; n >>= 1) {
                if ((n & 1) == 1) {
                    ++cnt;
                } else if (cnt > 0) {
                    ++ans;
                    cnt = cnt == 1 ? 0 : 1;
                }
            }
            ans += cnt == 1 ? 1 : 0;
            ans += cnt > 1 ? 2 : 0;
            return ans;
        }
    }
    
  • class Solution {
    public:
        int minOperations(int n) {
            int ans = 0, cnt = 0;
            for (; n > 0; n >>= 1) {
                if ((n & 1) == 1) {
                    ++cnt;
                } else if (cnt > 0) {
                    ++ans;
                    cnt = cnt == 1 ? 0 : 1;
                }
            }
            ans += cnt == 1 ? 1 : 0;
            ans += cnt > 1 ? 2 : 0;
            return ans;
        }
    };
    
  • class Solution:
        def minOperations(self, n: int) -> int:
            ans = cnt = 0
            while n:
                if n & 1:
                    cnt += 1
                elif cnt:
                    ans += 1
                    cnt = 0 if cnt == 1 else 1
                n >>= 1
            if cnt == 1:
                ans += 1
            elif cnt > 1:
                ans += 2
            return ans
    
    
  • func minOperations(n int) (ans int) {
    	cnt := 0
    	for ; n > 0; n >>= 1 {
    		if n&1 == 1 {
    			cnt++
    		} else if cnt > 0 {
    			ans++
    			if cnt == 1 {
    				cnt = 0
    			} else {
    				cnt = 1
    			}
    		}
    	}
    	if cnt == 1 {
    		ans++
    	} else if cnt > 1 {
    		ans += 2
    	}
    	return
    }
    

All Problems

All Solutions