6367. 求出最多标记下标
给你一个下标从 0 开始的整数数组 nums
。
一开始,所有下标都没有被标记。你可以执行以下操作任意次:
i
和 j
,满足 2 * nums[i] <= nums[j]
,标记下标 i
和 j
。请你执行上述操作任意次,返回 nums
中最多可以标记的下标数目。
示例 1:
输入:nums = [3,5,2,4] 输出:2 解释:第一次操作中,选择 i = 2 和 j = 1 ,操作可以执行的原因是 2 * nums[2] <= nums[1] ,标记下标 2 和 1 。 没有其他更多可执行的操作,所以答案为 2 。
示例 2:
输入:nums = [9,2,5,4] 输出:4 解释:第一次操作中,选择 i = 3 和 j = 0 ,操作可以执行的原因是 2 * nums[3] <= nums[0] ,标记下标 3 和 0 。 第二次操作中,选择 i = 1 和 j = 2 ,操作可以执行的原因是 2 * nums[1] <= nums[2] ,标记下标 1 和 2 。 没有其他更多可执行的操作,所以答案为 4 。
示例 3:
输入:nums = [7,6,8] 输出:0 解释:没有任何可以执行的操作,所以答案为 0 。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
原站题解
php 解法, 执行用时: 245 ms, 内存消耗: 30.8 MB, 提交时间: 2024-09-12 09:23:05
class Solution { /** * @param Integer[] $nums * @return Integer */ function maxNumOfMarkedIndices($nums) { sort($nums); $n = count($nums); $i = 0; $j = intval(($n+1)/2); for ( $j = intval(($n+1)/2); $j < $n; $j++ ) { if ( $nums[$i] * 2 <= $nums[$j] ) $i++; } return $i * 2; } }
rust 解法, 执行用时: 23 ms, 内存消耗: 3.8 MB, 提交时间: 2024-09-12 09:02:43
impl Solution { pub fn max_num_of_marked_indices(mut nums: Vec<i32>) -> i32 { nums.sort_unstable(); let mut i = 0; for &x in &nums[(nums.len() + 1) / 2..] { if nums[i] * 2 <= x { // 找到一个匹配 i += 1; } } (i * 2) as _ } }
javascript 解法, 执行用时: 183 ms, 内存消耗: 61.9 MB, 提交时间: 2024-09-12 09:02:28
/** * @param {number[]} nums * @return {number} */ var maxNumOfMarkedIndices = function(nums) { nums.sort((a, b) => a - b); const n = nums.length; let i = 0; for (let j = Math.floor((n + 1) / 2); j < n; j++) { if (nums[i] * 2 <= nums[j]) { // 找到一个匹配 i++; } } return i * 2; };
python3 解法, 执行用时: 120 ms, 内存消耗: 29.4 MB, 提交时间: 2023-02-27 14:28:37
class Solution: def maxNumOfMarkedIndices(self, nums: List[int]) -> int: nums.sort() i = 0 for x in nums[(len(nums) + 1) // 2:]: if nums[i] * 2 <= x: i += 1 return i * 2
java 解法, 执行用时: 27 ms, 内存消耗: 59.7 MB, 提交时间: 2023-02-27 14:28:24
class Solution { public int maxNumOfMarkedIndices(int[] nums) { Arrays.sort(nums); int i = 0, n = nums.length; for (int j = (n + 1) / 2; j < n; ++j) if (nums[i] * 2 <= nums[j]) ++i; return i * 2; } }
cpp 解法, 执行用时: 124 ms, 内存消耗: 58.6 MB, 提交时间: 2023-02-27 14:28:11
class Solution { public: int maxNumOfMarkedIndices(vector<int> &nums) { sort(nums.begin(), nums.end()); int i = 0, n = nums.size(); for (int j = (n + 1) / 2; j < n; ++j) if (nums[i] * 2 <= nums[j]) ++i; return i * 2; } };
golang 解法, 执行用时: 148 ms, 内存消耗: 9.5 MB, 提交时间: 2023-02-27 14:27:56
// 双指针 func maxNumOfMarkedIndices(nums []int) int { sort.Ints(nums) i := 0 for _, x := range nums[(len(nums)+1)/2:] { if nums[i]*2 <= x { i++ } } return i * 2 }
golang 解法, 执行用时: 156 ms, 内存消耗: 9.6 MB, 提交时间: 2023-02-27 14:27:27
func maxNumOfMarkedIndices(nums []int) int { sort.Ints(nums) n := len(nums) return 2 * sort.Search(n/2, func(k int) bool { k++ for i, x := range nums[:k] { if x*2 > nums[n-k+i] { return true } } return false }) }
cpp 解法, 执行用时: 200 ms, 内存消耗: 58.6 MB, 提交时间: 2023-02-27 14:27:12
class Solution { public: int maxNumOfMarkedIndices(vector<int> &nums) { sort(nums.begin(), nums.end()); auto check = [&](int k) -> bool { for (int i = 0; i < k; ++i) if (nums[i] * 2 > nums[nums.size() - k + i]) return false; return true; }; int left = 0, right = nums.size() / 2 + 1; // 开区间 while (left + 1 < right) { int mid = left + (right - left) / 2; (check(mid) ? left : right) = mid; } return left * 2; } };
java 解法, 执行用时: 31 ms, 内存消耗: 59.6 MB, 提交时间: 2023-02-27 14:27:01
class Solution { public int maxNumOfMarkedIndices(int[] nums) { Arrays.sort(nums); int left = 0, right = nums.length / 2 + 1; // 开区间 while (left + 1 < right) { int mid = (left + right) >>> 1; if (check(nums, mid)) left = mid; else right = mid; } return left * 2; } private boolean check(int[] nums, int k) { for (int i = 0; i < k; ++i) if (nums[i] * 2 > nums[nums.length - k + i]) return false; return true; } }
python3 解法, 执行用时: 420 ms, 内存消耗: 29.5 MB, 提交时间: 2023-02-27 14:26:42
''' 二分法 ''' class Solution: def maxNumOfMarkedIndices(self, nums: List[int]) -> int: nums.sort() left, right = 0, len(nums) // 2 + 1 # 开区间 while left + 1 < right: k = (left + right) // 2 if all(nums[i] * 2 <= nums[i - k] for i in range(k)): left = k else: right = k return left * 2