You are given a 0-indexed integer array nums
.
Initially, all of the indices are unmarked. You are allowed to make this operation any number of times:
- Pick two different unmarked indices
i
andj
such that2 * nums[i] <= nums[j]
, then marki
andj
.
Return the maximum possible number of marked indices in nums
using the above operation any number of times.
Example 1:
Input: nums = [3,5,2,4] Output: 2 Explanation: In the first operation: pick i = 2 and j = 1, the operation is allowed because 2 * nums[2] <= nums[1]. Then mark index 2 and 1. It can be shown that there's no other valid operation so the answer is 2.
Example 2:
Input: nums = [9,2,5,4] Output: 4 Explanation: In the first operation: pick i = 3 and j = 0, the operation is allowed because 2 * nums[3] <= nums[0]. Then mark index 3 and 0. In the second operation: pick i = 1 and j = 2, the operation is allowed because 2 * nums[1] <= nums[2]. Then mark index 1 and 2. Since there is no other operation, the answer is 4.
Example 3:
Input: nums = [7,6,8] Output: 0 Explanation: There is no valid operation to do, so the answer is 0.
Constraints:
1 <= nums.length <= 105
1 <= nums[i] <= 109
Related Topics:
Array, Two Pointers, Binary Search, Greedy, Sorting
// OJ: https://leetcode.com/problems/find-the-maximum-number-of-marked-indices
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
int maxNumOfMarkedIndices(vector<int>& A) {
sort(begin(A), end(A));
int N = A.size(), L = 0, R = N / 2;
auto valid = [&](int k) {
int i = 0, j = N - k;
for (; i < k; ++i, ++j) {
if (2 * A[i] > A[j]) return false;
}
return true;
};
while (L <= R) {
int M = (L + R) / 2;
if (valid(M)) L = M + 1;
else R = M - 1;
}
return R * 2;
}
};