privatestaticintsearch2(int left,int right,int[] a, int value){ int n = right; //最后的一个位置下标 while (left <= right){ //中间下标 int mid = left + ((right - left) >> 1); if (a[mid] > value){ right = mid - 1; }elseif (a[mid] < value){ left = mid + 1; }else { //当该元素为最后一个元素或该元素后一个值不跟其相等则为最后一个符合条件 if (mid == n || a[mid + 1] != value){ return mid; }else { //从小到大第一个则左下标向右移 left = mid + 1; } } } return -1; }
第一个大于的下标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
privatestaticintsearch6(int left , int right ,int[] a, int value){ int n = right; //记录最后一个数据的下标 while (left <= right) { int mid=left+(right-left)/2; if (a[mid] <= value){ //关键点,<= left = mid + 1; } else { right = mid - 1; } } if(left>n) //区分索引越界,即没找到,范围为1~n的写>n;范围是0~n-1写≥n.n表示最后的一个数据下标 return -1; return left; }
第一个大于等于的下标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
privatestaticintsearch3(int left , int right ,int[] a, int value){ while (left <= right){ //中间下标 int mid = left + ((right - left) >> 1); if (a[mid] >= value){ //当该元素为第一个元素或该元素前一个值小于给定值则为第一个符合条件 if (mid == 0 || a[mid - 1] < value){ return mid; }else { //从小到大第一个则右下标向左移 right = mid - 1; } }else { left = mid + 1; } } return -1; }
最后一个小于的下标
1 2 3 4 5 6 7 8 9 10 11 12 13 14
privatestaticintsearch5(int left , int right ,int[] a, int value){ while (left <= right) { int mid=left+(right-left)/2; if (a[mid] >= value){ //关键点,>= right = mid - 1; } else { left = mid + 1; } } if(right<0) //区分索引越界,即没找到 return -1; return right; }
最后一个小于等于的下标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
privatestaticintsearch4(int left , int right ,int[] a, int value){ int n = right; while (left <= right){ //中间下标 int mid = left + ((right - left) >> 1); if (a[mid] > value){ right = mid - 1; }else { //当该元素为最后一个元素或该元素后一个值大于给定值则为最后一个符合条件 if (mid == n || a[mid + 1] > value){ return mid; }else { //从小到大第一个则左下标向右移 left = mid + 1; } } } return -1; }