力扣二分查找练习题
一、题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position
二、示例
三、代码
public class Solution {
public int SearchInsert(int[] nums, int target) {
int low = 0,high = nums.Length-1;
int mid=0;
while(low<=high)
{
mid = (low + high) / 2;
if (target>nums[mid])
{
low = mid + 1;
}
else if (target<nums[mid])
{
high = mid - 1;
}
else if (target == nums[mid])
{
return mid;
}
}
if (target > nums[mid])
{
return mid + 1;
}
else
return mid;
}
}
分析
这道题有个要求请必须使用时间复杂度为 O(log n) 的算法。
so 我们很熟悉的一个时间复杂度为 O(log n) 的算法是哪个呢,二分查找。
排序数组、目标值,
返回索引或按顺序插入。
上半部分while循环所实现的就是二分查找,找目标值,找到后返回索引。
按顺序插入这个问题,讲真,一开始真把我懵住了。我都想再来一遍查找,找按顺序插入的位置了。
但是看了别人的代码,我知道了,是我傻了。
二分查找的前提条件是什么?
是所查找的数组一定是有序数组啊!
所以你最终得到的mid一定是离target最近的数字,不是大于就是小于目标数字。
用一个if就能实现按顺序的插入。