Leetcode 1608. Special Array With X Elements Greater Than or Equal X
You are given an array nums
of non-negative integers. nums
is considered special if there exists a number x
such that there are exactly x
numbers in nums
that are greater than or equal to x
. Notice that x
does not have to be an element in nums
.
Return x
if the array is special, otherwise return -1
. It can be proven that if nums
is special, then there is a unique x
that satisfies the condition.
Q: What range of values can the elements of nums
take?
A: The elements in nums
are non-negative integers, i.e., they can range from 0
to a large positive value subject to the problem constraints.
Q: What is the size range of the array nums
?
A: The size of nums
can vary, but usually, in such problems, we can expect it to follow standard constraints like up to 10^4
elements unless specified otherwise.
Q: Is there any specific edge case we need to consider? A: Edge cases could include an empty array or an array with all elements being the same.
Sort the Array: Start by sorting the array. This allows us to easily determine how many numbers are greater than or equal to any given number.
Iterate and Check: Iterate through the array to check at each position if the count of elements greater than or equal to the current element matches the condition.
Binary Search Optimization: Since the array is sorted, we can leverage binary search to optimize the check for the condition if required.
#include <vector>
#include <algorithm>
class Solution {
public:
int specialArray(std::vector<int>& nums) {
std::sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i <= n; ++i) {
auto it = std::lower_bound(nums.begin(), nums.end(), i);
int count = nums.end() - it;
if (count == i) {
return i;
}
}
return -1;
}
};
nums
to make it easier to find the count of elements greater than or equal to a given value.x
from 0
to n
(length of nums
).std::lower_bound
to find the first element not less than i
. The number of elements greater than or equal to i
is then calculated by nums.end() - it
.count == i
, then we return i
as it satisfies the condition. If no such i
is found, return -1
.lower_bound
is (O(\log n)). Hence, iterating from 0
to n
results in (O(n \log n)).Thus, the overall time complexity is (O(n \log n)). This is efficient enough for typical input sizes in competitive programming.
Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?