力扣:35. 搜索插入位置

15 篇文章 0 订阅
本文介绍了如何在给定的有序数组中使用二分查找算法寻找目标值的插入位置,确保时间复杂度为O(logn),并通过实例展示了两种方法的实现过程:暴力解法和二分查找法。
摘要由CSDN通过智能技术生成

力扣:35. 搜索插入位置

描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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

1.暴力解法

从数组的左边遍历到右边,如果遇到相等的元素,直接返回下标;如果遇到第 1 个严格大于 target 的元素,返回这个元素的下标;如果数组里所有的元素都严格小于 target,返回数组的长度 len。
代码如下:

#include<iostream>
#include<vector>
using namespace std;
class Solution{
public:
	int searchInsert(vector<int>& nums, int target){
		int num = 0;
		int tmp = 0;
		for(int i = 0; i < nums.size(); i++){
			if(nums[i] == target){
				return i;
			}
			if(nums[i] > target && num == 0){
				tmp = i;
				num = 1;
			}
		}
		if(num == 0){
			return nums.size();
		}
		else {
			return tmp;
		}
	}
};

int main(){
	Solution solution;
	 vector<int> nums = {1,3,5,6,9,13,27,34,49,58,60};
	int target = 44;
	int insertPostion = solution.searchInsert(nums,target);
	cout << "The inset postion for target " << target << " is " << insertPostion << endl;
	return 0;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a2d9f9092b774b24b3842c2484f87f19.png

2.二分查找

在有序数组中查找插入元素的位置,显然可以使用二分查找。提供的思路是「排除法」,思路是:在循环的过程中,不断排除不需要的解,最后剩下的那个元素的位置就一定是插入元素的位置。

具体来说:

首先,插入位置有可能在数组的末尾,需要单独判断,此时返回数组的长度;
否则,根据示例和暴力解法的分析,插入的位置是大于等于 target 的第 1 个元素的位置。
因此,严格小于 target 的元素一定不是解,在循环体中将左右边界 left 和 right 逐渐向中间靠拢,最后 left 和 right 相遇,则找到了插入元素的位置。根据这个思路,可以写出如下代码。

#include<iostream>
#include<vector>
using namespace std;
class Solution{
public:
	int insearchInsert(vector<int> & nums, int target){
		int len = nums.size();
		if(len == 0){
			return 0;
		}
		if(nums[len - 1] < target){
			return len;
		}
		int left = 0;
		int right = len - 1;
		while(left < right){
			int mid = left + ((right - left) / 2);
			if(nums[mid] < target){
				left = mid + 1;
			}
			else {
				right = mid;
			}
		}
		return left;
	}
};
int main()
{
	Solution solution;
	vector<int> nums = {1,3,5,6,9,13,27,34,49,58,60};
	int target = 44;
	int insertPostion = solution.insearchInsert(nums,target);
	cout << " The target " << target << " is " << insertPostion << endl;
	return 0;
}

在这里插入图片描述
时间复杂度:O(log⁡n)O(\log n)O(logn),其中 nnn 为数组的长度。二分查找所需的时间复杂度为 O(log⁡n)O(\log n)O(logn)。

空间复杂度:O(1)O(1)O(1)。我们只需要常数空间存放若干变量。

力扣:35. 搜索插入位置

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值