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
若数组中没有target,即最后没有匹配A[mid] == target,那么
如果最后front > mid, (即rear = mid),那么target比A[mid]大(因此才会有front=mid+1),应位于A[mid]之后,返回mid+1;
如果
最后rear < mid, (即front = mid),那么target比A[mid]小(因此才会rear=mid-1),target应位于mid这个位置,返回mid,原来在mid这个位置的往后挪一位。
上面的关系一定要理清楚。
参考代码:
class Solution {
public:
int searchInsert(int A[], int n, int target) {
int front = 0, rear = n-1, mid;
while(front<=rear)
{
mid = (front+rear)/2;
if(A[mid]==target)
{
return mid;
}
else if(A[mid] < target)
{
front = mid+1;
}
else
{
rear = mid-1;
}
}
if(mid > rear)
{
return mid;
}
return mid+1;
}
};
//SECOND TRIAL
class Solution {public :int searchInsert ( int A [], int n , int target ) {if ( ! A || ! n )return 0 ;int left = 0 , right = n - 1 , mid ;while ( left <= right ){mid = ( left + right ) / 2 ;if ( target == A [ mid ])return mid ;else if ( target < A [ mid ])right = mid - 1 ;elseleft = mid + 1 ;}return left ;}};
python version:
class Solution :# @param A, a list of integers# @param target, an integer to be inserted# @return integerdef searchInsert ( self , A , target ):if not A :return 0 ;left = 0right = len ( A ) - 1while left <= right :mid = ( left + right ) // 2if A [ mid ] < target :left = mid + 1elif A [ mid ] > target :right = mid - 1else :return midreturn left