力扣:35. 搜索插入位置

力扣: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. 搜索插入位置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499178.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你如何使用ESP8266(ESP-01S)连接到阿里云物联网平台,并通过微信小程序控制设备(如灯的亮、灭、数据上报到微信中显示)

前言 最近在做智能家居的项目&#xff0c;主要是通过esp8266接入云端实现远程控制的效果&#xff0c;于是就想到用微信小程序进行控制。由于阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑设备数据采集上云&#xff1b;向上提…

答应我,在vue中不要滥用watch好吗?

前言 上周五晚上8点&#xff0c;开开心心的等着产品验收完毕后就可以顺利上线。结果产品突然找到我说要加需求&#xff0c;并且维护这一块业务的同事已经下班走了&#xff0c;所以只有我来做。虽然内心一万头草泥马在狂奔&#xff0c;但是嘴里还是一口答应没问题。由于这一块业…

web前端-html表单元素

文章目录 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>周鑫的</title></head> <body> <form action"06、内联框架.html" method"get"><h1>登录…

江科大stm32学习笔记——【4-1】OLED

一.原理 1.调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息。 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上。 Keil调试模式&#xff1a;借助Keil软件的调…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 &#x1f981; 一. 前言&#x1f981; 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 &#x1f981; 一. 前言 各位好&#xff01;我是&#x1…

Unity绘制六边形体

现在steam上面有很多下棋类/经营类的游戏都是用六边形的地形&#xff0c;比较美观而且实用&#xff0c;去年在版本末期我也自己尝试做了一个绘制六边体的demo&#xff0c;一年没接触unity竟然都要忘光了&#xff0c;赶紧在这边记录一下。 想cv代码可以直接拉到代码章节 功能 …

面试官:谈一谈Cookie和Session的区别?

我先解释一下Cookie&#xff0c;它是客户端浏览器用来保存服务端数据的一种机制&#xff0c;当我们通过浏览器去进行网页访问的时候&#xff0c;服务器可以把一些状态数据以key-value的形式写入到Cookie里面&#xff0c;存储到客户端浏览器。下一次这个浏览器再访问服务器的时候…

JavaEE——简单认识JavaScript

文章目录 一、简单认识 JavaScript 的组成二、基本的输入输出和简单语法三、变量的使用四、JS 中的动态类型图示解释常见语言的类型形式 五、JS中的数组六、JS 中的函数七、JS 中的对象 一、简单认识 JavaScript 的组成 对于 JavaScript &#xff0c;其中的组成大致分为下面的…

【嵌入式——QT】日期与定时器

日期 QTime&#xff1a;时间数据类型&#xff0c;仅表示时间&#xff0c;如 16:16:16&#xff1b;QDate&#xff1a;日期数据类型&#xff0c;仅表示日期&#xff0c;如2024-1-22&#xff1b;QDateTime&#xff1a;日期时间数据类型&#xff0c;表示日期和时间&#xff0c;如2…

软件测试有哪些常用的测试方法?

软件测试是软件开发过程中重要组成部分&#xff0c;是用来确认一个程序的质量或者性能是否符合开发之前提出的一些要求。软件测试的目的有两方面&#xff0c;一方面是确认软件的质量&#xff0c;另一方面是提供信息&#xff0c;例如&#xff0c;给开发人员或者程序经理反馈意见…

MATLAB环境下脑电信号EEG的谱分析

脑电信号一直伴随着人类的生命&#xff0c;脑电波是脑神经细胞发生新陈代谢、离子交换时细胞群兴奋突触电位总和&#xff0c;脑电信号的节律性则和丘脑相关&#xff0c;含有丰富的大脑活动信息。通常我们所接触的脑电图都是头皮脑电图&#xff0c;在有些特殊场合还需要皮下部位…

(正规api接口代发布权限)短视频账号矩阵系统实现开发--技术全自动化saas营销链路生态

短视频账号矩阵系统实现开发--技术全自动化saas营销链路生态源头开发&#xff08;本篇禁止抄袭复刻&#xff09; 一、短视频矩阵系统开发者架构 云罗短视频矩阵系统saas化系统&#xff0c;开发层将在CAP原则基础上使用分布式架构,对此网站的整体架构采用了基于B/S三层架构模式…