Search Insert Position 查詢給定元素在陣列中的位置,若沒有則返回應該在的位置

範長法@三月軟體發表於2014-10-29

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 → 0

如題所述,最直觀的做法就是二分查詢。不過在使用二分查詢解決此問題時,需要多加小心,先考慮清楚所有情況,再開始編碼。

首先考慮邊界:

  1. 若給定target小於陣列第一個元素,返回0;
  2. 若target大於最後一個元素,返回n

使用二分,結束迴圈條件應該是high-low=1的情況。

例如[1,3,5,6]中查詢2,二分一次後,low=0,high=1,此時A[low]=1,A[high]=3。

若按照平常使用的二分查詢就應該找不到元素exit了,但是要返回元素的值則需要再進一步處理,此時low+1,或high-1即為元素應該的位置。

下面程式碼裡我把target等於邊界值(陣列第1個和第n個)的情況放到最後比較了。

 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 };

 

相關文章