给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
解题思路:看到排序数组明白是一道明显的二分查找题,当然也可以通过顺序查找实现。
/*
直接查找
*/
int searchInsert_1(int* nums, int numsSize, int target){ //数组nums, nums长度numSize,目标值target
for(int i = 0; i < numsSize; i ++)
if(nums[i] >= target) return i;
return numsSize;
}
/*
二分查找
*/
int searchInsert_2(int* nums, int numsSize, int target){ //数组nums, nums长度numSize,目标值target
int low = 0, high = numsSize - 1;
int mid;
while(high >= low){
mid = (high + low) / 2;
if(nums[mid] == target) return mid;
else if(target > nums[mid]) low = mid + 1;
else high = mid - 1;
}
return target > nums[mid] ? mid + 1 : mid;
}
全部代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
//直接查找
int searchInsert_1(int* nums, int numsSize, int target){ //数组nums, nums长度numSize,目标值target
for(int i = 0; i < numsSize; i ++)
if(nums[i] >= target) return i;
return numsSize;
}
//二分查找
int searchInsert_2(int* nums, int numsSize, int target){ //数组nums, nums长度numSize,目标值target
int low = 0, high = numsSize - 1;
int mid;
while(high >= low){
mid = (high + low) / 2;
if(nums[mid] == target) return mid;
else if(target > nums[mid]) low = mid + 1;
else high = mid - 1;
}
return target > nums[mid] ? mid + 1 : mid;
}
int main(){
int arr[] = {1, 2, 2, 2, 3, 4, 5, 6, 7, 8};
printf("原数组:\n");
for(int i = 0; i < 10; i ++) cout<<arr[i]<<" ";
int k = searchInsert_1(arr, 10, 6);
cout<<endl;
cout<<"6插入的位置:"<<k<<endl;
k = searchInsert_2(arr, 10, 8);
cout<<"8插入的位置:"<<k<<endl;;
}
代码运行结果:
更多代码请参考:手撕考研数据结构(代码汇总)