当前位置: 首页 > news >正文

LeetCode | 数组 | 二分查找 | 35.搜索插入位置【C++】

题目链接

题目描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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

分析思路

  • 前提有序数组+数组中无重复元素(一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的)
  • 确认方法:二分查找法
  • 注:二分法中关于区间的定义一般为两种——“左闭右闭[left, right]” 或 “左闭右开[left, right)”

代码实现

实现一:左闭右闭

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;  // 左闭右闭while (left <= right){  // 当left==right,区间[left, right]依然有效,所以用<=int middle = left + ((right - left) / 2);  // 防止溢出if (nums[middle] > target){ // target在左区间 [left, middle-1]right = middle - 1;} else if (nums[middle] < target){ // target在右区间 [middle+1, right]left = middle + 1;} else { // nums[middle] == targetreturn middle; // 找到目标值,直接返回下标}}// 1.目标值在数组所有元素之前 [0, -1]// 2.目标值插入数组中的位置 [left, right]// 3.目标值在数组所有元素之后 [nums.size(), nums.size()-1]return right + 1;// return left;}
};

实现二:左闭右开

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size();  // 左闭右开while (left < right){  // 当left==right,区间[left, right)无效int middle = left + ((right - left) / 2);  // 防止溢出// int middle = left + ((right - left) >> 1); // >>按位右移运算符,等同于变量除以2if (nums[middle] > target){ // target在左区间 [left, middle)right = middle;} else if (nums[middle] < target){ // target在右区间 [middle+1, right)left = middle + 1;} else { // nums[middle] == targetreturn middle; // 找到目标值,直接返回下标}}// 1.目标值在数组所有元素之前 [0, 0)// 2.目标值插入数组中的位置 [left, right)// 3.目标值在数组所有元素之后 [nums.size(), nums.size() )return right;// return left;}
};

参考来源:代码随想录 

补充:位移运算符为何能将数据乘以或除以 2^{n} ?

按位右移运算符(>>)将变量除以2^{n};按位左移运算符(<<)将变量乘以2^{n}

例如:

变量num的值为16,其二进制表示为10000。将num右移1位,结果为01000,即8,这相当于将其减半;将num右移两位,变成了00100,即4,相当于计算num的1/4。向左移1位时结果为100000,即32,向左移两位的结果为1000000,即64,相当于计算num的2倍和4倍。

http://www.lryc.cn/news/331772.html

相关文章:

  • Linux 给网卡配置ip
  • 【C语言】翻译环境与运行环境
  • ubuntu20.04执行sudo apt-get update失败的解决方法
  • 接口调用成功后端却一直返回404
  • 【Vmware】 debian 12 安装教程
  • YooAssets 使用相关
  • 精准扶贫管理系统|基于Springboot的精准扶贫管理系统设计与实现(源码+数据库+文档)
  • Flutter与iOS和Android原生页面交互
  • Chrome安装Vue插件vue-devtools
  • 内存和网卡压力测试
  • 法律行业案例法模型出现,OPenAI公布与法律AI公司Harvey合作案例
  • 详解Qt网络编程
  • docker版Elasticsearch安装,ik分词器安装,用户名密码配置,kibana安装
  • Python中的Requests库:HTTP请求的简单之道
  • [RK3566-Android11] 关于 a2dpsink -蓝牙支持接收播放/无PIN码连接
  • 玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析
  • 前端路径问题总结
  • YOLOv8改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)
  • python的pip如何升级
  • Collection与数据结构 Stack与Queue(一): 栈与Stack
  • 内部类(来自类和对象的补充)
  • Android 高德地图
  • 代码随想录|Day31|贪心06|738.单调递增的数字
  • 机械制造学习笔记
  • Golang | Leetcode Golang题解之第3题无重复字符的最长子串
  • SWM341系列应用(上位机应用)
  • 【软件工程】详细设计(一)
  • 【AIGC】如何在Windows/Linux上部署stable diffusion
  • 基于java实现的弹幕视频网站
  • 【大数据存储】实验4 NoSQL数据库