2529. 正整数和负整数的最大计数
题目描述:
给你一个按 非递减顺序 排列的数组 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 。
提示:
- 1 <= nums.length <= 2000
- -2000 <= nums[i] <= 2000
- nums 按 非递减顺序 排列。
解题分析及思路:
方法:二分查找
思路:
通过二分查找确认第一个 0 的位置 number1 和第一个 1 的位置 number2 ,以此来计算负整数的个数(number1)和正整数的个数(len(nums) - number2)。
随后比较返回 number1
和 len(nums) - number2
中的较大值。
func maximumCount(nums []int) int {
number1 := count(nums, 0)
number2 := len(nums) - count(nums, 1)
if number1 > number2 {
return number1
}
return number2
}
func count(nums []int, target int) int {
left, right := 0, len(nums)
for left < right {
mid := left + (right-left)/2
if nums[mid] < target {
left = mid + 1
} else {
right = mid
}
}
return left
}
复杂度:
- 时间复杂度:O(logN)
- 空间复杂度:O(1)
执行结果:
- 执行耗时:11 ms,击败了48.61% 的Go用户
- 内存消耗:5.7 MB,击败了100.00% 的Go用户