const biPart=(target,arr)=>{ let low=0,high=arr.length-1; let count=0; //找不到的情况下: 最后low与high相等时low总比high大1 //为什么这里不能用low<high? 因为low<high的话无法判断最后low/high的位置 //比如 1 2 4 6 6 7 找5最后low=3是一个比5大的数,找3最后low=2是一个比3小的数 //但是如果low<=high, 最后的low都是比要找的那个数大的,相当于low表示arr中比target大的数的个数!!! while (low<=high){ let mid=Math.floor((low+high)/2); if (arr[mid]>target){ high=mid-1; }else if (arr[mid]<target){ low=mid+1; }else { //找得到的情况: 这里存在重复数字,重复时最后low=high就没有上面的考虑 low=mid; //最后用low返回 //mid>0的情况下,找到第一个target的位置 while (mid&&arr[--mid]===target){ low--; } break; } } //low代表arr中小于target的数字的个数 //arr.length-low则表示arr中大于等于target数字的个数 return arr.length-low; } 请问一下第一题的二分是这种思路吗
点赞 评论
牛客网
牛客企业服务