Skip to content

2529. 正整数和负整数的最大计数 Easy

给你一个按 非递减顺序 排列的数组 nums ,返回正整数数目和负整数数目中的最大值。

换句话讲,如果 nums 中正整数的数目是 pos ,而负整数的数目是 neg ,返回 posneg 二者中的最大值。

注意:0 既不是正整数也不是负整数。

示例 1:
输入:nums = [-2,-1,-1,1,2,3]
输出:3
解释:共有 3 个正整数和 3 个负整数。计数得到的最大值是 3 。

示例 2:
输入:nums = [-3,-2,-1,0,0,1,2]
输出:3
解释:共有 2 个正整数和 3 个负整数。计数得到的最大值是 3 。

示例 3:
输入:nums = [5,20,66,1314]
输出:4
解释:共有 4 个正整数和 0 个负整数。计数得到的最大值是 4 。

解题思路

输入: 一个非递减数组 nums

输出: 返回数组中正整数数量和负整数数量中更大的值

本题属于二分查找类问题。

我们可以参考 34 题的解法,我们可以将问题转化成查找边界问题

正整数的数量就相当于查找 1 的左边界下标 i,通过数组 len(nums) - i 可以得到

负整数的数量相当于查找 0 的左边界下标 j,负整数的数量就是 0 的左边界下标

代码实现

python
class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        # 二分查找第一个 >= target 的下标
        def lower_bound(nums, target):
            left, right = 0, len(nums)
            while left < right:
                mid = (left + right) // 2
                if nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid
            return left

        # 负数个数:第一个 >= 0 的下标(即负数的右边界)
        neg_count = lower_bound(nums, 0)

        # 正数个数:从第一个 > 0 的下标到数组末尾的长度
        pos_count = len(nums) - lower_bound(nums, 1)

        # 返回较大的那个
        return max(neg_count, pos_count)
javascript
/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumCount = function(nums) {
    function lowerBound(nums, target) {
        let left = 0;
        let right = nums.length - 1;

        while (left <= right) {
            const mid = Math.floor((left + right) / 2);
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return left;
    }

    const neg = lowerBound(nums, 0);
    const pos = nums.length - lowerBound(nums, 1);

    return Math.max(pos, neg);
};

复杂度分析

时间复杂度:O(log n)

空间复杂度:O(1)

链接

2529 国际版

2529 中文版