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
在有序数组中查找关键字,找到返回下标,没找到,就返回其要插入的位置。
方案一:顺序查找
找到第一个大于等于key的位置,就是说要求解的。方法很简单,但查找效率有点低。
方案二:二分查找
碰到查找问题,就要尽量利用二分查找来实现,可以降低程序的时间复杂度。
题目很简单,但是碰到了两个失误的地方:
1:输入参数的检验。没有养成一个好习惯,要时刻记着输入参数是否符合要求。
2:求一个数组的长度,如果sizeof()中是数组名,就能通过sizeof(arr)/sizeof(int)来求解。如果是传入函数中的指针,则arr只占据了一个指针的空间!虽然知道这个知识点,但容易遗忘。以后,如果函数中需要数组的长度信息,就必须以参数的形式传入!
#include <stdio.h>
#include <stdlib.h>
int SearchInsertPosition(int arr[],int n, int key);
int SearchInsert(int arr[], int n, int key);
int main(void)
{
int arr[] = { 1, 3, 5, 6 };
int key;
int len = sizeof(arr) / sizeof(int); //失误二:将该变量放入函数中调用期望得到数组长度,但传进函数的是指针,求的结果为1!
while (scanf_s("%d", &key,1) != EOF){
int res = SearchInsert(arr, len, key);
printf("%d\n", res);
}
return 0;
}
//函数中需要数组的长度,必须以显示的参数形式传递,没有别的方法获取长度。
int SearchInsertPosition(int arr[],int n,int key)
{
int i;
if (arr == NULL || n == 0) //失误一:没有判断输入条件
return 0;
for (i = 0; i < n; ++i){
if (arr[i] >= key){
break;
}
}
return i;
}
//利用二分查找提高查找速度!
int SearchInsert(int arr[], int n, int key)
{
if (arr == NULL || n == 0)
return 0;
int left = 0, right = n - 1, mid = 0;
while (left <= right){
mid = (left + right) / 2;
if (arr[mid] == key)
return mid;
if (arr[mid] > key)
right = mid - 1;
else
left = mid + 1;
}
return left;
}