今天再来更新一道算法,和上次的二分查找大差不差也就多了一点点东西
看题,得知题目的破局点是0这个数它既不是正整数也不是负整数
那么我一开始想的思路,就是直接用二分查找哦判断mid指针指向的是不是0这个数字,是的话直接让l=mid+1返回左指针。但是很明显题目给的第三个测试用例都是整数,没有0这个数,但是写的代码最后会让左指针和右指针相等,最后返回左指针0.这里再给大家贴一下我的错误代码:
以上是错误代码,这里不多解释就是int mid那一行是 看到大佬的特别写法,我把它看成是
(l + r)/ 2的高级用法,看着这种写法不用在意数据溢出并且执行的速度很快。
好,接下来我们认真分析一下题目,题目的目的就是要比较一个数组中负数和正数的个数,哪个大返回哪个的值。前面我们说到,0这个数就是负数与正数的分界线,也是我们的破局点。
看题解得知,我们要在题目给我们的maximinCount这个函数中找到数组中第一个大于等于的0数以及第一个大于0的数(因为我们这里是整数类型,那么写的时候必然要寻找数值为1的数)。
而在这个方法中,我们int neg = search(nums[],0); //这里neg是负数的个数从开始到0数之前
int pos = nums.length - search(nums[],1)//这里pos就是正数的个数
我们要用数学方法中的最大值来返回自定义的两函数中较大者,完整代码如下:
class Solution {
public int maximumCount(int[] nums) {
int neg = search(nums,0);
int pos =nums.length - search(nums,1);
return Math.max(neg,pos);
}
private int search(int[] nums,int x){
int l =0,r=nums.length;
while(l<r){
int mid = (l+r)>>>1; //这里我是看做(l+r)/2的高级版,懂得大佬可以讲解一下
if(nums[mid]<x){
l = mid+1;
}else{
r = mid;
}
}
return l;
}
}
共勉。