题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出:2
示例 2:
输入:nums = [1,3,5,6], target = 2 输出:1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums
为 无重复元素 的 升序 排列数组-10^4 <= target <= 10^4
分析:
题目中提到“请必须使用时间复杂度为 O(log n) 的算法”,而且数组是无重复元素的升序数组,这就很明显要用二分查找。
1、元素只有两种情况——在或不在数组中。
元素不在数组中时,返回的是按顺序插入的位置。
这个数组是个升序的,
当插入的元素最小时,即插入元素小于第一个元素时(小于等于也行),
返回的值就是0。
当插入的元素最大时,即插入元素大于最后一个元素时(大于等于也是同样的),
返回的值就是原数组的长度(因为返回的是索引)。
if (target > nums[numsSize - 1])return numsSize;
if (target < nums[0])return 0;
2、二分查找
for (; left <= right;) {
int middle = (left + right) / 2;
if (nums[middle] == target)return middle;
else if (nums[middle] > target && nums[middle - 1] < target)return middle ;
else if (nums[middle] > target) right = middle - 1;
else if (nums[middle + 1] > target)return middle + 1;
else left = middle + 1;
}
3、 最后要加上一个return。
如果没有的话,会报错哦,因为函数必须要有返回值。(尽管你知道它会有返回值的)
代码:
c:
int searchInsert(int* nums, int numsSize, int target) {
if (target > nums[numsSize - 1])return numsSize;
if (target < nums[0])return 0;
int left = 0, right = numsSize - 1;
for (; left <= right;) {
int middle = (left + right) / 2;
if (nums[middle] == target)return middle;
else if (nums[middle] > target && nums[middle - 1] < target)return middle ;
else if (nums[middle] > target) right = middle - 1;
else if (nums[middle + 1] > target)return middle + 1;
else left = middle + 1;
}
return numsSize;
}
java:
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0,right=nums.length,middle=0;
if(target<nums[0])return 0;
if(target>nums[right-1])return right;
while(left<=right){
middle=(left+right)/2;
if(nums[middle]==target)return middle;
else if(nums[middle]<target&&nums[middle+1]>target){
return middle+1;
}
else if(nums[middle]<target){
left=middle+1;
}
else if(nums[middle]>target&&nums[middle-1]<target) return middle;
else right=middle-1;
}
return middle;
}
}
运行截图:
下周再见哦。
注:题目描述和实例来自Leetcode官网,链接:35. 搜索插入位置 - 力扣(LeetCode)