2601. Prime Subtraction Operation
HardView on LeetCode
Time: O(n + max)
Space: O(max)
Problem Overview
Check if n has exactly k set bits and is prime.
Intuition
Check if n has exactly k set bits and is prime. Count bits, check primality.
Algorithm
- 1If popcount(n) != k: false. If n is prime: true.
Common Pitfalls
- •Two conditions: exact bit count AND primality. Use simple trial division for primality.
2601.cs
C#
// Approach: Sieve primes; for each element subtract largest prime that keeps it > previous element.
// Time: O(n + max) Space: O(max)
public class Solution
{
public bool PrimeSubOperation(int[] nums)
{
const int kMax = 1000;
var primes = SieveEratosthenes(kMax);
int prevNum = 0;
for (int k = 0; k < nums.Length; k++)
{
int num = nums[k];
// Make nums[i] the smallest as possible and still > nums[i - 1].
int i = FirstGreaterEqual(primes, num - prevNum);
if (i > 0)
num -= primes[i - 1];
if (num <= prevNum)
return false;
prevNum = num;
nums[k] = num;
}
return true;
}
private List<int> SieveEratosthenes(int n)
{
var primes = new List<int>();
var isPrime = new bool[n];
Array.Fill(isPrime, true);
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i * i < n; ++i)
{
if (isPrime[i])
{
for (int j = i * i; j < n; j += i)
isPrime[j] = false;
}
}
for (int i = 2; i < n; ++i)
{
if (isPrime[i])
primes.Add(i);
}
return primes;
}
private int FirstGreaterEqual(List<int> A, int target)
{
int i = A.BinarySearch(target);
return i < 0 ? -i - 1 : i;
}
}Was this solution helpful?
Related Problems
- 826. Most Profit Assigning Work(Medium)
- 1671. Minimum Number of Removals to Make Mountain Array(Hard)
- 2071. Maximum Number of Tasks You Can Assign(Unknown)
- 2141. Maximum Running Time of N Computers(Unknown)
- 2294. Partition Array Such That Maximum Difference Is K(Hard)
- 2311. Longest Binary Subsequence Less Than or Equal to K(Medium)