Search Insert Position
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
题目大意
给定一个排好序的数组和一个目标值,如果能找到目标值,就返回这个索引。如果不能找到,就返回如果把这个值按需插入的话应该在的位置的索引。
思路
- 暴力搜索
从左到右搜索,如果找到这个值,就返回索引值;如果查找到比这个值大的值了,说明没有这个值,并且如果把这个值插入的话就插入在这个位置,就返回这个索引;如果查询到最后一个还小于目标值,说明应该把目标值插入到当前最后一个值的下一个索引位置。时间复杂度为O(N)。 - 二分查找
用二分查找法进行查找,如果查找到就返回查找到的索引位置,如果查找不到就把left索引返回,即为需要插入的位置。时间复杂度为O(log2n)。
代码
#include<iostream>
using namespace std;
// 暴力查找法
int searchInsert_1(int A[], int n, int target)
{
for(int i=0; i<n; i++)
{
if(A[i] == target) return i;
if(A[i] > target) return i;
if(A[i] < target && i == (n-1)) return n;
}
return -1;
}
// 二分查找法
int searchInsert(int A[], int n, int target)
{
int l=0,r=n-1;
while(l<=r)
{
int mid = (l+r)/2;
if(A[mid] == target)return mid;
if(A[mid] > target) r = mid-1;
if(A[mid] < target) l = mid+1;
}
return l; // left索引即为需要插入的索引位置
}
int main()
{
int A[]={1,3,5,6};
int target=5;
cout<<searchInsert(A, 4, target)<<endl;
target=2;
cout<<searchInsert(A, 4, target)<<endl;
target=7;
cout<<searchInsert(A, 4, target)<<endl;
target=0;
cout<<searchInsert(A, 4, target)<<endl;
return 0;
}
运行结果
- 以上。