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].

思想:二分递归的方法和二分查找,明确最后终止的位置

  1. int search(int[] A,int target,int start,int end,boolean flag){
  2. int res = 0;
  3. if(flag) {
  4. res = end;
  5. } else {
  6. res = start;
  7. }
  8. while(start<=end) {
  9. int mid = start + (end-start)/2;
  10. if(A[mid] == target) {
  11. if(flag) {
  12. if(start!=mid) {
  13. res = search(A,target,start,mid,true); //注意退出条件
  14. break; 
  15. }
  16. else {
  17. res= start;
  18. break;
  19. }
  20. } else {
  21. if(mid+1>=end) {
  22. if(mid==end) res = mid;
  23. else {
  24. if(A[end] == target) res = end;
  25. else res = mid;
  26. }
  27. break;
  28. } else {
  29. res = search(A,target,mid,end,false);
  30. break;
  31. }
  32. }
  33. } else if(A[mid] <target){
  34. start = mid + 1;
  35. } else {
  36. end = mid -1;
  37. }
  38. }
  39. return res;
  40. }
  41. public int[] searchRange(int[] A, int target) {
  42. int length = A.length;
  43. int[] res = new int[2];
  44. if(length == 0) {
  45. res[0] = -1;
  46. res[1] = -1;
  47. return res;
  48. }
  49. int start = 0;
  50. int end = length-1;
  51. int sindex = -1;
  52. int eindex = -1;
  53. while(start <= end) {
  54. int mid = start + (end - start)/2;
  55. if(A[mid] == target) {
  56. sindex = search(A,target,start,mid,true);
  57. eindex = search(A,target,mid,end,false);
  58. break;
  59. } else if(A[mid] < target) {
  60. start = mid + 1;
  61. } else {
  62. end = mid - 1;
  63. }
  64. }
  65. res[0] = sindex;
  66. res[1] = eindex;
  67. return res;
  68. }

改进无递归:

  1. public int[] searchRange(int[] A, int target) {
  2. int length = A.length;
  3. int[] res = new int[2];
  4. res[0] = -1;
  5. res[1] = -1;
  6. if(length == 0) {
  7. return res;
  8. }
  9. int start = 0;
  10. int end = length-1;
  11. int sindex = -1;
  12. int eindex = -1;
  13. int find = -1;
  14. while(start <= end) {
  15. int mid = start + (end - start)/2;
  16. if(A[mid] == target) {
  17. find = mid;
  18. break;
  19. } else if(A[mid] < target) {
  20. start = mid + 1;
  21. } else {
  22. end = mid - 1;
  23. }
  24. }
  25. if(find == -1) {
  26. return res;
  27. }
  28. start = 0;
  29. sindex = find;
  30. while(start < sindex) {
  31. int mid = start + (sindex-start)/2;
  32. if(A[mid] == target) {
  33. sindex = mid;
  34. } else {
  35. start = mid + 1;
  36. }
  37. }
  38. res[0] = sindex;
  39. end = A.length - 1;
  40. eindex = find;
  41. while(eindex<end) {
  42. int mid = eindex + (end - eindex)/2;
  43. if(A[mid] == target) {
  44. eindex = mid;
  45. if(mid+1==end) {
  46. if(A[end] == target) eindex = end;
  47. break;
  48. }
  49. } else {
  50. end = mid - 1;
  51. }
  52. }
  53. res[1] = eindex;
  54. return res;
  55. }

左区间和右区间优化

  1. start = 0;
  2. sindex = find;
  3. while(start <= sindex) {
  4. int mid = start + (sindex-start)/2;
  5. if(A[mid] == target) {
  6. sindex = mid-1;
  7. } else {
  8. start = mid + 1;
  9. }
  10. }
  11. res[0] = start;
  12. end = A.length - 1;
  13. eindex = find;
  14. while(eindex<=end) {
  15. int mid = eindex + (end - eindex)/2;
  16. if(A[mid] == target) {
  17. eindex = mid + 1;
  18. } else {
  19. end = mid - 1;
  20. }
  21. }
  22. res[1] = end;
  23. return res;
posted @ 2014-08-10 15:04  purejade  阅读(84)  评论(0)    收藏  举报