LeetCode 第34、35题

LeetCode 第34题:在排序数组中查找元素的第一个和最后一个位置

题目描述

给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,1]。你必须设计并实现时间复杂度为为O(log n)的算法解决此问题。

难度:中等

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

示例1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0<=nums.length<=105
  • -109<=nums[i]<=109
  • nums是一个非递减数组
  • -109<=target<=109

解题思路:二分查找

关键点:

  • 寻找左边界时,即使找到目标值也继续向左搜索
  • 寻找右边界时,即使找到目标值也继续向右搜索
  • 两次二分查找的条件稍有不同 
int binarySearch(int* nums,int numsSize,int target,bool lower)
{int left = 0,right = numsSize-1,ans = numsSize;while(left<=right){int mid=(left+right)/2;if(nums[mid]>target || (lower && nums[mid] >=target)){right = mid-1;ans=mid;}elseleft=mid+1;}return ans;
}int* searchRange(int* nums,int numsSize,int target,int* returnSize)
{int leftIdx = binarySearch(nums,numsSize,target,true);int rightIdx = binarySearch(nums,numsSize,target,false)-1;int* ret = malloc(sizeof(int)*2);*returnSize=2;if(leftIdx<=rightIdx && rightIdx<numsSize && nums[leftIdx]==target && nums[rightIdx]==target){ret[0]=leftIdx,ret[1]=rightIdx;return ret;}ret[0]=-1,ret[1]=-1;return ret;
}

返回的left永远是首个大于等于target的数的位置,right永远是首个小于target的数的位置,左边界按正常查找,右边查target+0.5即可。5

int binSearch(vector<int>& nums,double target)
{int n=nums.size();int left = 0,right = n-1;while(left<=right){int mid = (left+right)/2;if(nums[mid]>=target) right = mid-1;else left = mid+1;}return left;
}
public:
vector<int> searchRange(vector<int>& nums,int target)
{if(nums.size()==0) return {-1,-1};int l = binSearch(nums,target);int r=binSearch(nums,target+0.5)-1;if(l>=nums.size() || r<0 || l>r)  return {-1,-1};return {l,r};}

LeetCode 第35题:搜索插入位置

题目描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(log n)的算法。

难度:简单

题目链接:35. 搜索插入位置 - 力扣(LeetCode)

示例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

示例4:

输入: nums = [1,3,5,6], target = 0
输出: 0

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

解题思路:二分查找

  • 初始化左右指针
  • 进行二分查找
  • 如果找到目标值,直接返回
  • 如果找不到,返回left指针位置
int searchInsert(int* nums, int numsSize, int target)
{int left = 0,right = numsSize-1;while(left<=right){int mid = left+(right-left)/2;if(nums[mid] == target)  return mid;else if(nums[mid]<target)  left = mid +1;else  right = mid-1;}return left;
}

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

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

相关文章

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…

第十四届蓝桥杯真题

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…

《基于机器学习发电数据电量预测》开题报告

个人主页&#xff1a;大数据蟒行探索者 目录 一、选题背景、研究意义及文献综述 &#xff08;一&#xff09;选题背景 &#xff08;二&#xff09;选题意义 &#xff08;三&#xff09;文献综述 1. 国内外研究现状 2. 未来方向展望 二、研究的基本内容&#xff0c;拟解…

UWP程序用多页面实现应用实例多开

Windows 10 IoT ARM64平台下&#xff0c;UWP应用和MFC程序不一样&#xff0c;同时只能打开一个应用实例。以串口程序为例&#xff0c;如果用户希望同时打开多个应用实例&#xff0c;一个应用实例打开串口1&#xff0c;一个应用实例打开串口2&#xff0c;那么我们可以加载多个页…

Springboot整合Netty简单实现1对1聊天(vx小程序服务端)

本文功能实现较为简陋&#xff0c;demo内容仅供参考&#xff0c;有不足之处还请指正。 背景 一个小项目&#xff0c;用于微信小程序的服务端&#xff0c;需要实现小程序端可以和他人1对1聊天 实现功能 Websocket、心跳检测、消息持久化、离线消息存储 Netty配置类 /*** au…

GitLab 中文版17.10正式发布,27项重点功能解读【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

好消息!软航文档控件(NTKO WebOffice)在Chrome 133版本上提示扩展已停用的解决方案

软航文档控件现有版本依赖Manifest V2扩展技术支持才能正常运行&#xff0c;然而这个扩展技术到2025年6月在Chrome高版本上就彻底不支持了&#xff0c;现在Chrome 133开始的版本已经开始弹出警告&#xff0c;必须手工开启扩展支持才能正常运行。那么如何解决这个技术难题呢&…

字典树与01trie

字典树简介 当我们通过字典查一个字或单词的时候&#xff0c;我们会通过前缀或关键字的来快速定位一个字的位置&#xff0c;进行快速查找。 字典树就是类似字典中索引表的一种数据结构&#xff0c;能够帮助我们快速定位一个字符串的位置。 字典树是一种存储字符串的数据结构…

二十五、实战开发 uni-app x 项目(仿京东)- 前后端轮播图

定义了一个名为 Swiper 的Java类,用于表示一个轮播图实体。它使用了 Jakarta Persistence API (JPA) 来映射数据库表,并使用了 Lombok 库来简化代码。以下是对代码的详细讲解: 1. 包声明 package com.jd.jdmall.model; 这行代码声明了该类所在的包路径为 com.jd.jdmall.mode…

游戏摇杆开发:利用 Windows API 实现摇杆输入捕获

在现代游戏开发中&#xff0c;游戏摇杆&#xff08;Joystick&#xff09;作为一种重要的输入设备&#xff0c;能够为玩家提供更加沉浸式的游戏体验。Windows 操作系统提供了一系列 API 函数&#xff0c;允许开发者轻松地捕获和处理游戏摇杆的输入。本文将介绍如何使用 Windows …

Ceph集群2025(Squid版)快速对接K8S cephFS文件存储

ceph的块存储太简单了。所以不做演示 查看集群 创建一个 CephFS 文件系统 # ceph fs volume create cephfs01 需要创建一个子卷# ceph fs subvolume create cephfs01 my-subvol -----------------#以下全部自动创建好 # ceph fs ls name: cephfs01, metadata pool: c…

Python中数据结构元组详解

在Python中&#xff0c;元组&#xff08;Tuple&#xff09;是一种不可变的序列类型&#xff0c;常用于存储一组有序的数据。与列表&#xff08;List&#xff09;不同&#xff0c;元组一旦创建&#xff0c;其内容无法修改。本文将详细介绍元组的基本操作、常见运算、内置函数以及…

游戏引擎学习第183天

回顾和今天的计划 我对接下来的进展感到非常兴奋。虽然我们可能会遇到一些问题&#xff0c;但昨天我们差不多完成了将所有内容迁移到新的日志系统的工作&#xff0c;我们正在把一些内容整合进来&#xff0c;甚至是之前通过不同方式记录时间戳的旧平台层部分&#xff0c;现在也…

Spring 如何处理循环依赖

在 Spring 框架里&#xff0c;循环依赖指的是多个 Bean 之间相互依赖&#xff0c;从而形成一个闭环。例如&#xff0c;Bean A 依赖 Bean B&#xff0c;而 Bean B 又依赖 Bean A。Spring 主要通过三级缓存机制来处理循环依赖&#xff0c;下面详细介绍相关内容。 1. 三级缓存的定…

Android开发layer-list

Android开发layer-list 它的用处可以在drawable上进行多图拼接&#xff0c;比如启动页&#xff0c;不想图片被拉伸就这么做。还有做某些线突出来。 示例代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android&q…

手机测试,工作中学习

要学习各种机型的截图方式、开发模式在哪。 荣耀机型&#xff1a;截图&#xff1a;关节快速敲两下。开发者模式在“系统和更新”里。 1.出现缺陷&#xff0c;需要获取日志。 学习adb生成日志&#xff1a;当测试中出现缺陷的&#xff0c;使用adb logcat -d > d:/log.txt …

OBS虚拟背景深度解析:无需绿幕也能打造专业教学视频(附插件对比)

想要录制教学视频却苦于背景杂乱&#xff1f;本文将手把手教你用OBS实现专业级虚拟背景效果&#xff0c;无需绿幕也能轻松营造沉浸式教学场景。文末附6个提升画面质感的免费背景资源&#xff01; 一、虚拟背景的核心价值&#xff1a;从「教师宿舍」到「虚拟讲堂」的蜕变 我们调…

零基础搭建智能法律知识库!腾讯云HAI实战教程

为什么需要法律知识库&#xff1f; 想象一下&#xff0c;你的所有法律文件都在手边&#xff0c;随时可以搜索和分析。这就是法律知识库的魅力所在。对于法律专业人士、处理大量法律文档的企业&#xff0c;甚至是希望了解法律事项的普通人来说&#xff0c;法律知识库都是一个不…

Rust从入门到精通之进阶篇:19.Rust 生态系统

Rust 生态系统 Rust 拥有一个丰富而活跃的生态系统&#xff0c;提供了各种库和框架来支持不同领域的开发。在本章中&#xff0c;我们将探索 Rust 生态系统中的主要组件&#xff0c;了解常用的库和工具&#xff0c;以及如何在项目中有效地使用它们。 Rust 包管理&#xff1a;C…

前端面试:如何去衡量用户操作过程中否卡顿?

衡量用户在应用中的操作是否卡顿是前端开发中的一个关键任务&#xff0c;涉及用户体验的各个方面。以下是一些常用的方法和工具&#xff0c;可以帮助你有效地评估用户操作中的卡顿情况&#xff1a; 1. 使用性能分析工具 浏览器开发者工具&#xff1a;大多数现代浏览器&#xf…