2529. 正整数和负整数的最大计数 Easy
给你一个按 非递减顺序 排列的数组 nums
,返回正整数数目和负整数数目中的最大值。
换句话讲,如果 nums
中正整数的数目是 pos
,而负整数的数目是 neg
,返回 pos
和 neg
二者中的最大值。
注意: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)