Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.数组
You may assume no duplicates in the array.编码
Here are few examples.[1,3,5,6]
, 5 → 2[1,3,5,6]
, 2 → 1[1,3,5,6]
, 7 → 4[1,3,5,6]
, 0 → 0spa
如题所述,最直观的作法就是二分查找。不过在使用二分查找解决此问题时,须要多加当心,先考虑清楚全部状况,再开始编码。code
首先考虑边界:blog
使用二分,结束循环条件应该是high-low=1的状况。get
例如[1,3,5,6]中查找2,二分一次后,low=0,high=1,此时A[low]=1,A[high]=3。
it
若按照日常使用的二分查找就应该找不到元素exit了,可是要返回元素的值则须要再进一步处理,此时low+1,或high-1即为元素应该的位置。io
下面代码里我把target等于边界值(数组第1个和第n个)的状况放到最后比较了。class
1 class Solution { 2 public: 3 int searchInsert(int A[], int n, int target) { 4 if(A == NULL || n < 1) 5 return -1; 6 if(target < A[0]) 7 return 0; 8 if(target > A[n-1]) 9 return n; 10 11 int low = 0; 12 int high = n-1; 13 14 int mid = 0; 15 16 while(high-low>1){ 17 mid = low + (high - low)/2; 18 if(A[mid] == target) 19 return mid; 20 else if(A[mid] > target) 21 high = mid; 22 else 23 low = mid; 24 } 25 26 if(high-low ==1) 27 if(A[low] == target) 28 return low; 29 if(A[high] == target) 30 return high; 31 else 32 return low+1; 33 34 } 35 };