classSolution{publicintsearch(int[] nums,int target){int n = nums.length;if(n==0){return0;}int left=0, right = n-1, mid;int border=-1;while(left<=right){
mid = left +(right - left)/2;if(nums[mid]> target){
right = mid -1;}elseif(nums[mid]< target){
left = mid +1;}else{if(mid==n-1|| nums[mid+1]>target){
border = mid;break;}//nums[mid+1] == target
left = mid+1;}}if(border==-1){return0;}int R = border;
border =-1;
left =0;
right = n-1;while(left<=right){
mid = left +(right - left)/2;if(nums[mid]> target){
right = mid -1;}elseif(nums[mid]< target){
left = mid +1;}else{if(mid==0|| nums[mid-1]<target){
border = mid;break;}
right = mid -1;}}int L = border;return R - L +1;}}
/*
双指针? 时间复杂度O(N)
使用二分法应该是O(logN)的时间复杂度
*/classSolution{publicintsearch(int[] nums,int target){//input checkif(nums==null || nums.length==0|| target<nums[0]|| target>nums[nums.length-1])return0;int n = nums.length;int left=0, right=n-1, mid;int leftBorder=-1, rightBorder=n;//舍弃的思路: left指向左边界, right指向target; left和right的目标不同的话, while的循环条件就要变; 以前的二分法, left和right的目标是一样的//采用的思路: left和right都指向target//找左边界//下面的循环条件不适用于数组中只有一个元素的, 如果数组中只有一个元素则不会进入下面的循环//while(left<right)while(left<=right){
mid = left +((right-left)>>1);if(nums[mid]> target)
right = mid-1;elseif(nums[mid]< target)
left = mid +1;else{if(mid==0){
leftBorder=0;break;}if(nums[mid-1]!=target){
leftBorder = mid;break;}
right = mid -1;}}//数组中没有targetif(leftBorder==-1)return0;//再找右边界
left=0;
right=n-1;while(left<=right){
mid = left +((right-left)>>1);if(nums[mid]> target)
right = mid -1;elseif(nums[mid]< target)
left = mid +1;else{//注意, 数组中只有一个元素时, mid才能等于n-1if(mid==n-1){
rightBorder = mid;break;}//注意, 数组中有两个及以上的元素时, mid不会等于n-1的! 最大等于n-2if(nums[mid+1]!=target){
rightBorder=mid;break;}
left = mid +1;}}return rightBorder - leftBorder +1;}}
publicclassSolution{publicintGetNumberOfK(int[] array ,int k){if(array==null || array.length==0)return0;//找出左边界int left=0,right=array.length-1, mid, leftBorder=-1, rightBorder=-1;while(left<=right){
mid = left +((right-left)>>1);if(array[mid]< k)
left = mid+1;elseif(array[mid]> k)
right = mid-1;else{if(mid==0){
leftBorder = mid;break;}if(array[mid-1]!=k){
leftBorder = mid;break;}
right = mid -1;}}//找出右边界
left=0;
right=array.length-1;while(left<=right){
mid = left +((right - left)>>1);if(array[mid]< k)
left = mid +1;elseif(array[mid]> k)
right = mid -1;else{if(mid==array.length-1){
rightBorder = mid;break;}if(array[mid+1]!=k){
rightBorder = mid;break;}
left = mid +1;}}return left > right ?0: rightBorder - leftBorder +1;}}
第三次做, 双向遍历; while循环中更新数组索引后, 需要检查索引是否越界; O(N)
publicclassSolution{publicintGetNumberOfK(int[] array ,int k){if(array==null || array.length==0)return0;int left=0, right = array.length-1;while(left<array.length && array[left]!= k)
left++;while(right>=0&& array[right]!=k)
right--;return left <= right ? right - left +1:0;}}