力扣算法34. 在排序数组中查找元素的第一个和最后一个位置

news2024/11/15 15:47:46

Python&Java双语解决力扣必刷算法,题号34. 在排序数组中查找元素的第一个和最后一个位置

目录

题目描述

解题思路

完整代码

Java

Python


题目描述

        给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

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

解题思路

        要设计一个时间复杂度为 O(log n) 的算法来解决这个问题,我们可以使用二分查找法。由于数组是非递减顺序排列的,我们可以通过二分查找来定位目标值 target 的开始位置和结束位置。

具体步骤如下:

  1. 定义一个辅助函数 binarySearch,该函数接受数组 nums、目标值 target 和一个布尔值 leftBias 作为参数。leftBias 用于指示当找到 target 时是偏向左边还是右边。如果 leftBiastrue,则在找到 target 后继续向左查找,以确定 target 的最左边界;如果 leftBiasfalse,则向右查找以确定 target 的最右边界。
  2. 使用 binarySearch 函数两次,第一次传入 leftBiastrue 以找到 target 的开始位置,第二次传入 leftBiasfalse 以找到 target 的结束位置。
  3. 如果在第一次查找中没有找到 target,则返回 [-1, -1]
  4. 如果找到了 target,则返回开始位置和结束位置。

完整代码

Java

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int start = binarySearch(nums, target, true);
        if (start == nums.length || nums[start] != target) {
            return new int[]{-1, -1};
        }
        int end = binarySearch(nums, target, false) - 1;
        return new int[]{start, end};
    }
    
    // 二分查找辅助函数
    private int binarySearch(int[] nums, int target, boolean leftBias) {
        int low = 0, high = nums.length;
        while (low < high) {
            int mid = low + (high - low) / 2;
            if (nums[mid] > target || (leftBias && nums[mid] == target)) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
        return low;
    }
}

通过

Python

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def binarySearch(leftBias: bool) -> int:
            low, high = 0, len(nums) - 1
            index = -1
            while low <= high:
                mid = (low + high) // 2
                if target > nums[mid]:
                    low = mid + 1
                elif target < nums[mid]:
                    high = mid - 1
                else:
                    index = mid
                    if leftBias:
                        high = mid - 1  # 向左继续查找
                    else:
                        low = mid + 1  # 向右继续查找
            return index

        start = binarySearch(True)
        if start == -1:
            return [-1, -1]  # 如果没有找到起始位置,说明数组中没有目标值,直接返回[-1, -1]
        end = binarySearch(False)
        return [start, end]

        这个实现中,searchRange 方法包含了一个名为 binarySearch 的内部函数,该函数接受一个布尔参数 leftBias 来指示搜索方向。如果 leftBiasTrue,则搜索目标值的开始位置;如果为 False,则搜索结束位置。

  • 当找到目标值时,如果 leftBiasTrue,则将 high 指针移动到 mid - 1 以继续在左侧搜索目标值的最左边界;反之,如果 leftBiasFalse,则将 low 指针移动到 mid + 1 以在右侧继续搜索目标值的最右边界。

  • binarySearch 函数返回目标值在数组中的索引(如果找到),或 -1(如果未找到)。

  • 最终,通过两次调用 binarySearch 函数(一次寻找开始位置,一次寻找结束位置),并返回结果数组 [start, end]。如果 start-1,表示目标值不在数组中,直接返回 [-1, -1]

通过

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

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

相关文章

windows下mysql8.3解压安装后临时密码报1045错误解决

过程&#xff1a; 1.登录MySQL官网www.mysql.com&#xff0c;进入产品下载页面。 2.选择MySQL Community&#xff08;GPL&#xff09;Downloads链接跳转下载页。 3.选择MySQL Community Server。 4.选择安装方式。通常有解压包安装和步骤安装两种方式&#xff0c;这里选择了解…

【硬件设计】(更新中)以 UCC27710 为例设计栅极驱动器元件选型(资料摘抄)

还没更新完。。。。。。。 【仅作自学记录&#xff0c;不出于任何商业目的。如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01;】 本文摘抄翻译自&#xff1a; Bootstrap Network Analysis: Focusing on the Integrated Bootstrap Functionality (infineon.com)Boo…

集群下锁失效的问题(JAVA)

一&#xff0c;出现问题的原因 因此每一个锁对象&#xff0c;都会指向一个锁监视器&#xff0c;而每一个锁监视器&#xff0c;同一时刻只能被一个线程持有&#xff0c;这样就实现了互斥效果。但前提是&#xff0c;多个线程使用的是同一把锁。 但问题来了&#xff0c;我们的服务…

Unity 让角色动起来(动画控制器)

下载素材&#xff1a; 导入后&#xff0c;找到预制体和动画。 新建动画控制器&#xff0c;拖动到预制体的新版动画组件上。 建立动画关系 创建脚本&#xff0c;挂载到预制体上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public c…

github Commits must have verified signatures

1.首先确认是否有权限&#xff0c;如有权限的情况下那就是配置有问题了 我的情况是&#xff0c;能拉取代码&#xff0c;提交的时候出现这种情况&#xff1a;Commits must have verified signatures 这里是生成证书&#xff0c;如果已经生成过的&#xff0c;就不用生成了 ssh…

勒索软件事件手册:综合指南

近年来&#xff0c;勒索软件攻击的频率和复杂程度都急剧增加。这些攻击的影响可能是毁灭性的&#xff0c;从经济损失到严重的运营中断。 这就是为什么对于希望防范这种网络安全威胁的企业来说&#xff0c; 强大的勒索软件事件响应手册是不可谈判的。 本指南旨在深入了解勒索软…

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…

RabbitMQ 安装使用

文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World&#xff01;生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…

技术小知识:云计算服务下的IaaS,PaaS,SaaS⑥

一、云计算 云计算起源仿照天空的云朵聚集&#xff0c;意为对大量服务器的远程管理。以便能对服务器做空间、资源的最大动态协调利用和降低操作执行命令的复杂度。 二、云计算衍生下的服务 在服务器以一种云的形式存在&#xff0c;衍生除了很多服务提供&#xff0c;以便用户可以…

二分/树上第k短路,LeetCode2386. 找出数组的第 K 大和

一、题目 1、题目描述 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。 数组的 第 k 大和 定义为&#xff1a;可以获得的第 k 个 最大 子序列和&#xff08;子序列和允许出现重复&#xff09; 返回数组的 第 k 大和 。 子序列是…

Java高频面试之消息队列与分布式篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 消息队列的基本作用&#xff1f; 异步通信&#xff1a;消息队列提供了异步通信的能力&#xff0c;发送方可以将消息发送到队列中&#xff0c;而无需等待接收方立即处理。发送方和接收方可以解耦&#x…

Svg Flow Editor 原生svg流程图编辑器(二)

说明 这项目也是我第一次写TS代码哈&#xff0c;现在还被绕在类型中头昏脑胀&#xff0c;更新可能会慢点&#xff0c;大家见谅~ 目前实现的功能&#xff1a;1. 元件的创建、移动、形变&#xff1b;2. command API&#xff1b;3. eventBus listener 事件监听&#xff1b;4. regi…

结构体和malloc学习笔记

结构体学习&#xff1a; 为什么会出现结构体&#xff1a; 为了表示一些复杂的数据&#xff0c;而普通的基本类型变量无法满足要求&#xff1b; 定义&#xff1a; 结构体是用户根据实际需要自己定义的符合数类型&#xff1b; 如何使用结构体&#xff1a; //定义结构体 struc…

2024年新算法||吸引-排斥优化算法(Attraction–Repulsion Algorithm)

本期介绍一种求解约束全局优化问题的元启发式搜索算法——吸引-排斥优化算法Attraction–Repulsion Optimization Algorithm,AROA。该算法模拟自然界中发生的吸引-排斥现象相关的平衡。该成果于2024年2月发表在中科院1区SCI期刊 Swarm and Evolutionary Computation&#xff08…

【鸿蒙 HarmonyOS 4.0】常用组件:List/Grid/Tabs

一、背景 列表页面&#xff1a;List组件和Grid组件&#xff1b; 页签切换&#xff1a;Tabs组件&#xff1b; 二、列表页面 在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。下图中两个页面都包含列表&#xff0c;“…

为什么没有做好ETL的BI项目最终都会失败?

随着数字化转型&#xff0c;企业越来越重视数据的价值和利用。商业智能&#xff08;Business Intelligence&#xff0c;BI&#xff09;作为一种数据分析和决策支持的重要工具&#xff0c;被广泛应用于各行各业。然而&#xff0c;对于BI项目的成功实施&#xff0c;ETL&#xff0…

Aop注解+Redis解决SpringBoot接口幂等性(源码自取)

目录 一、什么是幂等性&#xff1f; 二、哪些请求天生就是幂等的&#xff1f; 三、为什么需要幂等 1.超时重试 2.异步回调 3.消息队列 四、实现幂等的关键因素 关键因素1 关键因素2 五、引入幂等性后对系统的影响 六、Restful API 接口的幂等性 实战Aop注解redis解…

单例九品--第五品

单例九品--第五品 上一品引入写在前边代码部分1代码部分2实现方式评注与思考下一品的设计思考 上一品引入 第四品中可能会因为翻译单元的链接先后顺序&#xff0c;造成静态初始化灾难的问题。造成的原因是因为存在调用单例对象前没有完成定义的问题&#xff0c;这一品将着重解…

站长必备溯源教程-绕过CDN查找背后IP的方法手段

绕过CDN查询背后真实IP方法&#xff1a; 方法一 DNS历史解析记录 查询域名的历史解析记录&#xff0c;可能会找到网站使用CDN前的解析记录&#xff0c;从而获取真实IP 相关查询的网站有&#xff1a;iphistory、DNS查询、微步在线、域名查询、DNS历史查询、Netcraft 方法二 …

基于springboot的水果购物商城管理系统(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…