【题目描述】
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
【测试用例】
示例1:
输入:nums = [1,3,5,6],target = 5
输出:2
示例2:
输入:nums = [1,3,5,6],target = 2
输出:1
示例2:
输入:nums = [1,3,5,6],target = 7
输出:4
【思路分析】
首先,看到这题,暴力解法应该是第一反应(有充足编程经验的大佬除外)。直接遍历nums中的所有元素,当遇到 ≥ target的元素时,返回当前索引即可。
但是!!!题目限定了必须用时间复杂度为O(logn)的算法,其实变相来说就是要用二分查找法。 练题多了以后,在有序数组中查找元素应该要肌肉记忆一样想到二分查找法。
二分查找是经典的查找算法。思想也很简单,把数组以中间元素为分隔,分成两半,每次只查一半,所以也叫折半查找。每次都查询数组中的中间的元素是不是target,是就直接返回索引,不是就再到以中间元素为分隔的左区间或者右区间去查找,直到找到或者不满足循环条件 left<=right 为止。(left和right分别为区间左右端点)
【参考代码】
C实现
#include <stdio.h>
//easy-35-搜索插入位置
int searchInsert(int* nums, int numsSize, int target);
int main(){
int nums[] = {1,3,5,6};
int numsSize = sizeof(nums)/sizeof(nums[0]);
int target = 5;
int pos = searchInsert(nums, numsSize, target);
printf("%d\n", pos);
return 0;
}
int searchInsert(int* nums, int numsSize, int target) {
int left=0, right=numsSize-1;
int mid;
while(left <= right){
mid = (left + right) / 2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}
}
return left;
}
C++实现
#include <iostream>
#include <vector>
using namespace std;
//easy-35-搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target);
};
int Solution::searchInsert(vector<int>& nums, int target){
int left=0, right=nums.size()-1;
int mid;
while(left <= right){
mid = (left + right) / 2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}
}
return left;
}
int main(){
vector<int> nums = {1,3,5,6};
int target = 5;
Solution sol;
int pos = sol.searchInsert(nums, target);
cout<<pos<<endl;
return 0;
}

被折叠的 条评论
为什么被折叠?



