思路
找到所有负整数的个数和正整数的个数,最终返回两者之间的最大值。题目所说是数组是有序的,换言之就是找到负整数和正整数的边界值,因为0不属于正整数和负整数,那么可以用0作为target进行二分查找。
可以将问题分解为,数组中存在0的时候和数组中不存在0的时候
- 当数组中存在0,并且有可能0的个数是多个的。进行两次二分找到边界值
- 当数组中不存在0,那么就是自然的找到第一个大于0的数字或者第一个小于0的数字
代码
class Solution {
public int maximumCount(int[] nums) {
int n = nums.length;
int ans = Integer.MIN_VALUE;
int left = 0;
int right = n - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (nums[mid] >= 0) right = mid;
else left = mid + 1;
}
if (nums[left] == 0) ans = Math.max(ans, left);
else ans = Math.max(ans, n - left);
left = 0;
right = n - 1;
while (left < right) {
int mid = (left + right + 1) >> 1;
if (nums[mid] <= 0) left = mid;
else right = mid - 1;
}
if (nums[left] == 0) ans = Math.max(ans, n - 1 - left);
else ans = Math.max(ans, left + 1);
return ans;
}
}