Search for a Range
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
思想:二分递归的方法和二分查找,明确最后终止的位置
- int search(int[] A,int target,int start,int end,boolean flag){
- int res = 0;
- if(flag) {
- res = end;
- } else {
- res = start;
- }
- while(start<=end) {
- int mid = start + (end-start)/2;
- if(A[mid] == target) {
- if(flag) {
- if(start!=mid) {
- res = search(A,target,start,mid,true); //注意退出条件
- break;
- }
- else {
- res= start;
- break;
- }
- } else {
- if(mid+1>=end) {
- if(mid==end) res = mid;
- else {
- if(A[end] == target) res = end;
- else res = mid;
- }
- break;
- } else {
- res = search(A,target,mid,end,false);
- break;
- }
- }
- } else if(A[mid] <target){
- start = mid + 1;
- } else {
- end = mid -1;
- }
- }
- return res;
- }
- public int[] searchRange(int[] A, int target) {
- int length = A.length;
- int[] res = new int[2];
- if(length == 0) {
- res[0] = -1;
- res[1] = -1;
- return res;
- }
- int start = 0;
- int end = length-1;
- int sindex = -1;
- int eindex = -1;
- while(start <= end) {
- int mid = start + (end - start)/2;
- if(A[mid] == target) {
- sindex = search(A,target,start,mid,true);
- eindex = search(A,target,mid,end,false);
- break;
- } else if(A[mid] < target) {
- start = mid + 1;
- } else {
- end = mid - 1;
- }
- }
- res[0] = sindex;
- res[1] = eindex;
- return res;
- }
改进无递归:
- public int[] searchRange(int[] A, int target) {
- int length = A.length;
- int[] res = new int[2];
- res[0] = -1;
- res[1] = -1;
- if(length == 0) {
- return res;
- }
- int start = 0;
- int end = length-1;
- int sindex = -1;
- int eindex = -1;
- int find = -1;
- while(start <= end) {
- int mid = start + (end - start)/2;
- if(A[mid] == target) {
- find = mid;
- break;
- } else if(A[mid] < target) {
- start = mid + 1;
- } else {
- end = mid - 1;
- }
- }
- if(find == -1) {
- return res;
- }
- start = 0;
- sindex = find;
- while(start < sindex) {
- int mid = start + (sindex-start)/2;
- if(A[mid] == target) {
- sindex = mid;
- } else {
- start = mid + 1;
- }
- }
- res[0] = sindex;
- end = A.length - 1;
- eindex = find;
- while(eindex<end) {
- int mid = eindex + (end - eindex)/2;
- if(A[mid] == target) {
- eindex = mid;
- if(mid+1==end) {
- if(A[end] == target) eindex = end;
- break;
- }
- } else {
- end = mid - 1;
- }
- }
- res[1] = eindex;
- return res;
- }
左区间和右区间优化
- start = 0;
- sindex = find;
- while(start <= sindex) {
- int mid = start + (sindex-start)/2;
- if(A[mid] == target) {
- sindex = mid-1;
- } else {
- start = mid + 1;
- }
- }
- res[0] = start;
- end = A.length - 1;
- eindex = find;
- while(eindex<=end) {
- int mid = eindex + (end - eindex)/2;
- if(A[mid] == target) {
- eindex = mid + 1;
- } else {
- end = mid - 1;
- }
- }
- res[1] = end;
- return res;

浙公网安备 33010602011771号