LeetCode 第34题:二分查找+扩展搜索

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

LeetCode 第34题要求在一个排序的数组中找到给定目标值的第一个和最后一个位置。如果目标值不存在,则返回 [-1, -1]。在本篇文章中,我将为大家提供详细的 C 语言解法,并逐行解释代码。

题目分析

给定一个升序排列的整数数组 nums 和一个目标值 target,我们需要找到目标值 target 在数组中首次和最后一次出现的位置。如果数组中没有目标值,则返回 [-1, -1]

解法思路

我们可以使用二分查找来加速搜索过程,利用排序数组的性质找到目标值的第一个和最后一个位置。

具体的思路如下:

  1. 使用二分查找找到目标值的位置。
  2. 找到目标值后,通过向左扩展和向右扩展的方式来确定目标值的最左和最右位置。
  3. 如果找不到目标值,返回 [-1, -1]

代码实现

代码解读

#include <stdio.h>
#include <stdlib.h>/*** searchRange 函数用于在已排序的数组中找到目标值的起始和结束位置。* 如果目标值不存在,则返回 [-1, -1]。* * @param nums: 排序后的整数数组。* @param numsSize: 数组的大小。* @param target: 要查找的目标值。* @param returnSize: 返回数组的大小,固定为2,表示包含目标值的范围。* @return: 一个包含目标值范围的数组,范围为 [left, right],如果目标值不存在返回 [-1, -1]。*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize) {// 设置返回数组的大小为2,表示结果为目标值的起始和结束位置*returnSize = 2;// 动态分配结果数组,用于存储目标值的起始和结束位置int* result = (int*)malloc(sizeof(int) * 2);// 检查内存分配是否成功if (result == NULL) {*returnSize = 0;  // 如果内存分配失败,返回0大小的数组return NULL;}// 初始化结果数组,默认值为 [-1, -1]result[0] = -1;result[1] = -1;// 如果数组为空或目标值不在数组的范围内,直接返回 [-1, -1]if (numsSize == 0 || nums[0] > target || nums[numsSize - 1] < target) {return result;}int left = 0;            // 左指针int right = numsSize - 1;  // 右指针int middle = 0;          // 中间指针// 二分查找目标值的位置while (left <= right) {middle = left + (right - left) / 2;  // 计算中间位置,避免溢出if (nums[middle] == target) {  // 找到目标值// 找到目标值后,向左和向右扩展,找到最左和最右的目标值int m_left = middle;int m_right = middle;// 向右扩展,直到不再等于目标值while ((m_right + 1) < numsSize && nums[m_right + 1] == target) {m_right += 1;}// 向左扩展,直到不再等于目标值while ((m_left - 1) >= 0 && nums[m_left - 1] == target) {m_left -= 1;}// 设置结果数组,返回最左和最右位置result[0] = m_left;result[1] = m_right;return result;}// 根据中间值与目标值的大小关系调整左右指针if (nums[middle] > target) {right = middle - 1;  // 如果目标值小于中间值,右指针左移} else {left = middle + 1;  // 如果目标值大于中间值,左指针右移}}// 如果没有找到目标值,返回 [-1, -1]return result;
}int main() {// 示例数组和目标值int nums[] = {5, 7, 7, 8, 8, 10};int target = 8;int returnSize;// 调用 searchRange 函数int* result = searchRange(nums, sizeof(nums) / sizeof(nums[0]), target, &returnSize);// 输出结果if (result != NULL) {printf("Range: [%d, %d]\n", result[0], result[1]);free(result);  // 记得释放动态分配的内存} else {printf("Target not found.\n");}return 0;
}

代码分析

  1. 初始化和内存分配:我们首先动态分配了一个 result 数组,用于存储目标值的最左和最右位置。若内存分配失败,我们将 returnSize 设置为 0 并返回 NULL

  2. 边界检查:在开始二分查找之前,我们进行了边界检查。如果目标值不可能出现在数组中(如目标值小于数组中的最小值或大于数组中的最大值),我们直接返回 [-1, -1]

  3. 二分查找:我们通过 while 循环进行二分查找,在找到目标值后,进一步扩展搜索范围,找到目标值的最左和最右位置。

  4. 结果输出:最后,我们通过 printf 输出目标值的范围。如果目标值不存在,我们输出 “Target not found”。

时间复杂度分析

  • 二分查找 的时间复杂度是 O(log n),在最坏情况下,我们只需要进行一次二分查找。
  • 扩展查找最左和最右位置的过程是线性的 O(n),但这仅在找到目标值后进行,所以整体时间复杂度仍然是 O(n)。

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

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

相关文章

数据结构:LinkedList与链表—面试题(三)

目录 1、移除链表元素 2、反转链表 3、链表的中间结点 4、返回倒数第k个结点 5、合并两个有序链表 1、移除链表元素 习题链接https://leetcode.cn/problems/remove-linked-list-elements/description/ 描述&#xff1a;给你一个链表的头节点 head 和一个整数 val &#xff…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…

LAMP搭建

LAMP搭建 引子&#xff1a;本篇文章为LAMP的搭建流程&#xff0c;其中L&#xff08;Ubuntu&#xff09;、A&#xff08;Apache&#xff09;、M&#xff08;Mysql&#xff09;、P&#xff08;PHP&#xff09;。 一、L → Ubuntu Step 1&#xff1a;在Vmware Workstation中使…

基于高斯混合模型的数据分析及其延伸应用(具体代码分析)

一、代码分析 &#xff08;一&#xff09;清除工作区和命令行窗口 clear; clc;clear;&#xff1a;该命令用于清除 MATLAB 工作区中的所有变量&#xff0c;确保代码运行环境的清洁&#xff0c;避免之前遗留的变量对当前代码运行产生干扰。例如&#xff0c;如果之前运行的代码中…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手&#xff0c;能够连接到众多主流加密货币交易所&#xff0c;如 Binance、Bitmart、Bybit 等&#xff08;支…

maven之插件调试

当使用maven进行项目管理的时候&#xff0c;可能会碰到一些疑难问题。网上资料很少&#xff0c;可能会想着直接调试定位问题。这里以maven-compiler-plugin为例&#xff1a; &#xff08;1&#xff09;准备maven-compiler-plugin源码 进入maven 官网-》Maven Plugins-》找到对…

如何配置Cursor的显示主题模式

cursor打开代码后&#xff0c;默认主题显示的主要代码颜色是白色&#xff0c;注解是黑色的&#xff0c;很不习惯&#xff0c;摸索一下&#xff0c;如何配置成与VSOCDE一样的主题&#xff0c;方案如下。 选择菜单 "File"--"Preferences 选择“ Theme" ---&…

Windows 系统中的任务管理器是什么,打开快捷键是什么?

任务管理器是 Windows 操作系统中一个强大的工具&#xff0c;它允许用户监控系统的性能、启动和停止进程、管理服务、以及查看网络活动等。掌握任务管理器的快捷键可以帮助你更高效地进行这些操作。本文中简鹿办公将教你如何利用任务管理器中的快捷键来提升你的工作效率。 一、…

论文导读 | 数据库中的连接操作

1. 连接操作的背景与问题定义 在关系型数据库中&#xff0c;我们通常面对以下问题&#xff1a; 给定一个数据库实例 I \mathcal{I} I&#xff0c;包含若干关系&#xff08;表&#xff09; R { R 1 , R 2 , ⋯ , R n } \mathcal{R}\{R_1, R_2, \cdots, R_n\} R{R1​,R2​,⋯…

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上&#xff0c;实例是别的同事搭建的。最近又又又想了解一下&#xff0c;而且已经盘了一些了&#xff0c;所以写写记录一下。因为这个事儿没太多的进度压力&#xff0c;索性写到哪儿算哪儿&#xff0c;只要是新了解到的…

【搜索】【推荐】大 PK

引言 在当今信息爆炸的时代&#xff0c;如何从海量数据中精准地为用户推荐最相关的内容成为了科技领域的关键挑战。搜推技术作为推荐系统的核心组件&#xff0c;扮演着至关重要的角色。本文将深入探讨这两种技术背后的方法论&#xff0c;剖析它们各自面临的难点&#xff0c;并…

多模态大模型初探索:通过ollama部署多模态大模型

文章目录 前言模型下载 前言 今天和同事聊天&#xff0c;聊到多模态大模型&#xff0c;感觉可以作为2025年的一个新的探索方向。希望和大家一起学习&#xff0c;一起进步。 今天也是尝试了我能想到的最基本最快速地本地部署多模态大模型的方式&#xff0c;那便是使用ollama。…

maven如何从外部导包

1.找到你项目的文件位置&#xff0c;将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

流媒体内网穿透/组网/网络映射EasyNTS上云网关启动失败如何解决?

在当今的网络视频监控和远程通信领域&#xff0c;设备的远程访问和数据共享需求日益增长。通过EasyNTS平台&#xff0c;用户无需开放内网端口&#xff0c;即可实现内网应用的外网访问&#xff0c;极大地简化了网络配置和维护工作。 EasyNTS上云网关的主要作用是解决异地视频共…

力扣刷题:数组OJ篇(下)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.轮转数组&#xff08;1&#xff09;题目描述…

flink cdc oceanbase(binlog模式)

接上文&#xff1a;一文说清flink从编码到部署上线 环境&#xff1a;①操作系统&#xff1a;阿里龙蜥 7.9&#xff08;平替CentOS7.9&#xff09;&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 预研初衷&#xff1a;现在很多项目有国产化的要求&#…

【Web】0基础学Web—事件对象、事件委托(事件代理)——星级评论案例

0基础学Web—事件对象、事件委托&#xff08;事件代理&#xff09;——星级评论案例 事件对象关闭鼠标右键的点击事件关闭鼠标滚轮的事件点击的目标对象点击鼠标的左键0 滚轮1 右键2获得被点击的节点的名称或取相对于浏览器左上角的距离&#xff08;会受页面滚动条的影响&#…

el-table 多级表头

1.结构 <el-table:data"tableData"border:height"700"style"width: 100% !important; overflow: auto":header-cell-style"{ background: #becee1, color: #333 }":cell-style"{ padding: 5px }"><template v-for…

计算机网络基础——网络协议

""" 资料的搬运工 """ 网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。 1、网络层次划分 OSI七层网络模型 1&#xff09;物理层 确保原始的数据可在各种物理媒体上传输 中继器&#xff08;放大器&#xff09;和集…