目录
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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 <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 要找到一个下标,该下标的值>=目标,且下标-1的值<目标
- 1.设定初始范围
- 2.判断条件
- 2.1该下标的值>=目标,且下标-1的值<目标,满足该条件,即是答案, 直接输出即可
- 2.2该下标的值>=目标,"但下标-1的值>目标",说明中值太大了,需要减少范围最大值
- 2.3"该下标的值<目标",说明中值太小了,需要增加范围最小值
- 3.边界条件
- 3.1如果目标是下标0的值,此时下标-1的值不存在,要怎么办?
- 3.2如果目标比数组内最大的值都大,怎么办?
- 解决方法
- 分别加个特殊判断条件,直接跳出即可
- 1.当目标小于等于下标0的值,直接返回下标0
- 2.当目标大于等于下标最大的值,直接放回最大的下标+1
代码
点击查看代码
int searchInsert(int* nums, int numsSize, int target){
int left,right,middle,shuchu; //分别是范围最小值,范围最大值,范围中值,输出值
int search(int xiabiao)
{
if(nums[xiabiao]>=target&&nums[xiabiao-1]<target)
{
shuchu = xiabiao; //储存输出值
return 0;
}
else if(nums[xiabiao]>=target&&nums[xiabiao-1]>=target)
{
right=middle-1;
// 该下标的值>=目标,"但下标-1的值>目标",说明中值太大了,需要减少范围最大值
}
else if(nums[xiabiao]<target)
{
left=middle+1;
// "该下标的值<目标",说明中值太小了,需要增加范围最小值
}
middle=(left+right)/2;
search(middle);
return 0;
}
// 如果目标是下标0的值,此时下标-1的值不存在,要怎么办?
// 分别加个特殊判断条件,直接跳出即可
// 当目标小于等于下标0的值,直接返回下标0
if(target<=nums[0])
{
return 0;
}
// 当目标大于等于下标最大的值,直接放回最大的下标+1
else if(target>nums[numsSize-1])
{
return numsSize;
}
//设定初始范围
else
{
left=0;
right=numsSize-1;
middle=(left+right)/2;
search(middle);
}
return shuchu; //返回输出值
}
本篇扯淡
- 话说我写这里的是为什么呢?如果只是想写题解的话,发在力扣那不就行了,何必在我这再发一次呢?
- 仔细思索一番后,得出结论,这是对我学习过程的记录,他证明了我的存在,见证我的曾经
- 毕竟对我而言,个人博客就如同自己的一个小天地似的,就算内容没有意义,但只要存在内容,那对我而言,就已经很有意义了
- 所以接着做吧,无论好坏,相信自己,总会逐渐变好的,等我学的差不多了,有余力了,也会把内容给优化的。
- 最后,如果有谁闲的来看我扯淡,那我祝你生活愉快,过得开心~(* ̄︶ ̄)