列表

详情


6367. 求出最多标记下标

给你一个下标从 0 开始的整数数组 nums 。

一开始,所有下标都没有被标记。你可以执行以下操作任意次:

请你执行上述操作任意次,返回 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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maxNumOfMarkedIndices(vector<int>& nums) { } };

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

上一题