NC105 二分查找进阶

<工控><PLC>汇川Easy521系列PLC与汇川SV630N伺服进行EtherCat通讯的相关配置及指令编写 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。 阅读详情

描述
请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1

数据范围:
进阶:时间复杂度,空间复杂度
示例1
输入:
[1,2,4,4,5],4
返回值:
2
说明:
从左到右,查找到第1个为4的,下标为2,返回2
示例2
输入:
[1,2,4,4,5],3
返回值:
-1
示例3
输入:
[1,1,1,1,1],1
返回值:
0
**方法一:**直接遍历 不用二分查找 这样不需要考虑特殊情况
**方法二:**利用二分查找 分两段的形式完成 但是如果像 11111这种情况就找不到最小的index
采用了递归的方式的代码为:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 如果目标值存在返回下标,否则返回 -1
# @param nums int整型一维数组 
# @param target int整型 
# @return int整型
#
class Solution:
    def search(self , nums: List[int], target: int) -> int:
        start = 0
        end = len(nums) - 1
        ind = self.searchtwo(start, end, nums, target)
        return ind
    def searchtwo(self, start, end , nums, target):
        mid = int((start + end) / 2)
        while start <= end:
            if target < nums[mid]:
                end = mid - 1
                return self.searchtwo(start, end , nums, target)
            elif target == nums[mid]:
                # 往前看是否还有更靠前的index
                i = mid - 1
                while i >= 0:
                    if nums[i] == target:
                        mid = i
                    i = i - 1
                return mid
            elif target > nums[mid]:
                start = mid + 1
                return self.searchtwo(start, end , nums, target)
        return -1

这里需要注意的就是:
1)递归的时候,每一种可能性都要有一个return
2)进行递归的条件是start <= end: 保证在数组中没有这个值的时候,跳出循环,返回-1
3)在更改start和 end的时候,一定是 mid + 1 或者mid -1 不然while循环永远也跳不出去,比如说找不到的时候就会一直不断赋值。
但是这种方法在遇到 [1, 1, 1, 1, 1]这种情况会导致还是要往前遍历找到最小的index,故时间复杂度为O(n)。
!!! 还要注意考虑长度为0的情况

**方法三:**减少时间复杂度,令时间复杂度为O(log n)
trick: 将while循环的条件改为start < end,故当start = end 时不能进入循环,这时只需要判断 index为 start或者end时,是否为target,证明当为target时就返回index不然就返回-1,这样就避免了再次往前遍历的情况。
故 方法二的形式只能说查找到,但是不一定找到对小的index。

  1. 用递归的方式的:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 如果目标值存在返回下标,否则返回 -1
# @param nums int整型一维数组 
# @param target int整型 
# @return int整型
#
class Solution:
    def search(self , nums: List[int], target: int) -> int:
        start = 0
        end = len(nums) - 1
        ind = self.searchtwo(start, end, nums, target)
        return ind
    def searchtwo(self, start, end , nums, target):
        if end < 0:
            return -1
        mid = int((start + end) / 2)
        while start < end:
            if target < nums[mid]:
                end = mid - 1
                return self.searchtwo(start, end , nums, target)
            elif target == nums[mid]:
                end = mid
                return self.searchtwo(start, end, nums, target)
            elif target > nums[mid]:
                start = mid + 1
                return self.searchtwo(start, end , nums, target)
        if nums[start] == target:
            return start
        else:
            return -1

不用递归的方式的:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 如果目标值存在返回下标,否则返回 -1
# @param nums int整型一维数组 
# @param target int整型 
# @return int整型
#
class Solution:
    def search(self , nums: List[int], target: int) -> int:
        start = 0
        end = len(nums) - 1
        ind = self.searchtwo(start, end, nums, target)
        return ind
    def searchtwo(self, start, end , nums, target):
        if end < 0:
            return -1
        while start < end:
            mid = int((start + end) / 2)
            if target < nums[mid]:
                end = mid - 1
            elif target == nums[mid]:
                end = mid
            elif target > nums[mid]:
                start = mid + 1
        if nums[start] == target:
            return start
        else:
            return -1

其他人比较好的:
没有用递归的方式的:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        if(n < 1 || nums[0] > target || nums[n - 1] < target) {
            return -1; //数组为空,数组中所有元素都大于/小于目标值时,直接返回-1
        }
        int i = 0, j = n - 1, mid = 0;
        while(i < j) {
            mid = (i + j) / 2;
            if(nums[mid] < target) {
                i = mid + 1;
            } else if(nums[mid] > target) {
                j = mid - 1;
            } else {
                j = mid;//为避免丢失答案,不能为mid-1
            }
        }
        return nums[i] == target ? i : -1; //最后进行一次判断
    }
};

如果求最大的index的话,不仅要把end = mid 部分改成start = mid,还要把每次求mid值后面+ 1,因为不然的话就会一直start为一个小的index,一直陷入while循环里,因为每次的0.5都舍去了,导致无法走出循环:

from typing import List
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 如果目标值存在返回下标,否则返回 -1
# @param nums int整型一维数组
# @param target int整型
# @return int整型
#
class Solution:
    def search(self , nums: List[int], target: int) -> int:
        start = 0
        end = len(nums) - 1
        ind = self.searchtwo(start, end, nums, target)
        return ind
    def searchtwo(self, start, end , nums, target):
        if end < 0:
            return -1
        mid = int((start + end) / 2) + 1
        while start < end:
            if target < nums[mid]:
                end = mid - 1
                return self.searchtwo(start, end , nums, target)
            elif target == nums[mid]:
                start = mid
                return self.searchtwo(start, end, nums, target)
            elif target > nums[mid]:
                start = mid + 1
                return self.searchtwo(start, end, nums, target)
        if nums[start] == target:
            return start
        else:
            return -1


if __name__ == '__main__':
    a = Solution()
    list = [1, 1, 1, 1, 1]
    b = a.search(list, 1)
    print(b)
1.2 从“跟网”到“构网”:技术范式的历史性转变 新型电力系统面临"双高"特征带来的稳定性挑战,促使并网控制技术从"跟网型"向"构网型"范式转变。传统跟网型变流器作为受控电流源依赖强电网,存在短路电流能力有限、易失稳等缺陷;而构网型变流器模拟同步发电机特性,作为受控电压源具备自主建立电压/频率、提供虚拟惯性、增强短路容量和改善系统阻尼四大核心能力。这一技术范式转变使变流器从电网跟随者变为构建支撑者,成为解决新能源大规模接入稳定性的关键。 阅读详情

相关推荐

从零构建基于ZYNQ与AD9361的SDR信号源:FPGA逻辑与射频前端的协同设计

本文详细介绍了从零开始构建基于ZYNQ与AD9361的SDR信号源的完整流程。通过解析FPGA逻辑与射频前端的协同设计,重点阐述了如何利用FPGA生成基带信号,并通过ARM处理器配置AD9361,最终实现一个可编程的2.4GHz载波信号发生器。内容涵盖硬件选型、Vivado环境搭建、AXI总线通信、LVDS接口设计及软件驱动开发,为SDR开发者提供了实用的实战指南。

weixin_29200485的博客 214

牛课力扣---NC105 二分查找-II

描述 请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1 示例1 输入: [1,2,4,4,5],4 返回值: 2 说明: 从左到右,查找到第1个为4的,下标为2,返回2 输入: [1,2,4,4,5],3 返回值: -1 示例3 输入: [1,1,1,1,1],1 复制 返回值: 0 # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返

weixin_38272982的博客 185

Ceres-solver examples之pose_graph_3d学习笔记

Ceres-solver examples之pose_graph_3d学习笔记简要说明变量说明关键步骤一、Costfunction的搭建其中包括:二、构造Problem 简要说明 ceres-solver库是google的非线性优化库,可以对slam问题,机器人位姿进行优化,使其建图的效果得到改善。pose_graph_3d是官方给出的二维平面上机器人位姿优化问题,需要读取一个g2o文件,运行程序...

幽冥小龙的博客 3890

每日一练之二分查找

二分查找 OJ 地址:二分查找 class Solution { public: /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a int整型vector 有序数组 * @return int整型 */ int upper_bound_(int n, int v, vector<int>& a) { // write

qq_41033011的博客 281

UE4 GamePlay框架深度解析:从蓝图到C++构建多人游戏核心

在游戏开发与实时交互应用领域,一套清晰、可扩展的底层框架是项目成功的关键。GamePlay框架作为虚幻引擎(UE4/UE5)的核心架构,定义了游戏世界中对象交互、状态管理与网络同步的基本原理。它通过职责分离的设计模式,将游戏规则(GameMode)、全局状态(GameState)、玩家状态(PlayerState)、可操控实体(Pawn/Character)及其控制器(Controller)等核心类有机组织起来,确保了逻辑的清晰性与多人游戏数据的一致性。其技术价值在于为开发者提供了一套经过验证的最佳实践,大

weixin_33924770的博客 619

CORS(跨域资源共享)漏洞解决方法

最近,测试环境上的项目被360测试人员检测出来有一个CORS漏洞,以下记录下漏洞问题与解决方法。 一、低危漏洞:CORS漏洞问题 测试人员访问某个url,将请求头中的Origin字段修改为任意值,结果仍然能获得正确的响应报文,就说明有CORS漏洞。 当CORS的设置不正确时,就会带来安全问题;当响应头中的Access-Control-Allow-Origin设置为null或*时,表示信任任何域,这时候就可能引入安全问题。 修复方法是合理配置CORS,判断Origin是否合法;具体说就是不让在nginx或t

BHSZZY的博客 3万+

题解:NC105-二分查找

NC105-二分查找 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 输入:5,4,[1,2,4,4,5] 输出:3 题解: int upper_bound_(int n, int v, vector<int>& a) { // write code here int low=0,high=n-1; while(low<high...

caicai779369786的博客 694

DESeq2实战:如何用LRT检验分析基因表达随时间变化的模式(附完整代码)

本文详细介绍了如何使用DESeq2中的LRT检验分析基因表达随时间变化的模式,包括实验设计、数据预处理、模型构建、结果提取与可视化等完整流程。通过实战案例和完整代码,帮助生物信息学研究者掌握时间序列RNA-seq分析的核心技术,特别适合需要快速上手的实践者。

weixin_42620255的博客 468

有重复数字的升序数组的二分查找

1.题目描述 描述 请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1 示例1 输入: [1,2,4,4,5],4 返回值: 2 说明: 从左到右,查找到第1个为4的,下标为2,返回2 示例2 输入: [1,2,4,4,5],3 返回值: -1 示例3 输入: [1,1,1,1,1],1 返回值: 0 题目链接:NC105 二分查找-II 2.

t18438605018的博客 2377

Unity3D实战:5分钟搞定RTSP监控视频播放(附完整代码)

本文提供了一套在Unity3D中快速集成RTSP监控视频播放的实战方案。通过采用LibVLCSharp for Unity这一成熟稳定的跨平台中间件,开发者可以轻松实现RTSP流的解码与渲染,并附有完整的C#代码示例,帮助用户在5分钟内完成集成,适用于智慧园区、安防监控等3D可视化场景。

weixin_29001655的博客 191

在Qt中使用EtherCAT-SOEM的初始化中,状态机卡在PreOp->Save-Op过程中,出现State=0x12, Error=0x001e错误的解决办法

1.在调试EtherCAT软件过程中,一直出现配置从站进不了Save_op状态,通过下函数检查从站状态: //使用的从站编号为1 只有1个从站 ec_slave[1].state = EC_STATE_SAFE_OP; ec_writestate(1); //设置到安全模式 ec_statecheck(1, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); printf("Slave %d State=0x%2.2x StatusCode=0x%4

zeal_for_rov的博客 6828

二分查找--实现有重复数字的升序数组

题目描述 请实现有重复数字的升序数组的二分查找 给定一个元素有序的(升序)整数数组nums和一个目标值target,如果目标值存在返回下标,否则返回-1 输入数组 [1,3,5,4,8,2,4,6,1,6,2,4] 输入目标值 3 输出返回值 4 # todo 获取一个有序数组 new_list = eval(input('请输入数组:')) # todo 获取一个目标值 target = int(input('请输入目标值:')) # todo 排序 使用二分查找必须是一个有序数组 new_

W-Y-Z的博客 821

【OpenClaw从入门到精通】第34篇:医疗AI的“Agent OS”时代:基于WiseClaw构建医院专属智能体平台(2026实测版)

2026年医疗AI迈入实战落地新阶段,全球首个医疗OpenClaw平台WiseClaw正式发布,香港中文大学(深圳)医院完成业内首个私有化部署。本文基于真实医疗场景需求与公开技术资料,系统拆解医疗智能体平台的建设逻辑:从医疗Agent OS的五大核心特性切入,详解门诊病历质控、用药审查、医院运行管理三大临床场景的智能体搭建流程,提供完整的私有化部署代码、安全配置方案与实操演示。文章兼顾新手入门与进阶需求,严格遵循医疗合规要求,强调“只读不写+人工复核”原则,所有方案均经过虚拟实测验证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 788

牛客题霸NC105二分查找Java题解

牛客题霸NC105二分查找Java题解 https://www.nowcoder.com/practice/7bc4a1c7c371425d9faa9d1b511fe193?tpId=117&&tqId=35030&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking 方法:二分法解题思路:利用左、右两个指针分别指向数组中的左右两个数,求left和right的中间数min,让min所指的位

云飞扬°的博客 271

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【刷题之路Ⅱ】牛客 NC105 二分查找-II

其实只需要判断左边界left是否等于target即可,因为左边界的改动的条件一定是上一轮nums[mid] < target,说明target在mid后面,而左边界改动进行的操作又是left = mid + 1,那如果下次的nums[left] == target,不就恰好说明找到了第一次出现的target了吗?故当left与right重合时,就可以判断lef指向的元素是否等于target,如果等于,则说明此时left指向的元素就是第一次出现的target,若不等于,则说明数组中不存在target。

kk702392702的博客 452

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

牛客网:NC105二分查找(Java)

剑指offer:56二分查找 做最好的今天,回顾最好的昨天,迎接最美好的明天。 题目描述: 请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target , 写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 题目分析: 一定一定一定要考虑重复数据 错误代码: public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

冬雨春雪 236

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

牛客网NC105 二分查找

NC105 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 二分答案模板题,区间中满足条件的最小值。 class Solution { public: /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a int整型vector 有序数组 * @return int整型 */ i

Stay Hungry, Stay Foolish. 431

NC105 二分查找

题目描述 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 示例1 输入 复制 5,4,[1,2,4,4,5] 输出 复制 3 题解: 注意结束条件是left <= right,应为mid计算是下取整,如果用 left < right的话有可能无法访问到right package com.wx.nowcoder; public class NC105 { public s..

ahcdwx的博客 195

java-NC105_二分查找-II

java-NC105 二分查找-II。

d3y1`5 81_09 151

牛客NC105-二分查找

题目描述 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 示例1 输入 5,4,[1,2,4,4,5] 输出 3 思路: 题目输出的是自然顺序而不是索引顺序; 1.递归 相当于是有重复数字的有序数组二分查找基础上,查找最左边的位置,如果当前元素大于等于目标值v,判断它前一个元素是否也大于等于目标值v,如大于则继续二次查找,否则返回该索引位置+1,递归结束条件为查找到或者右边界严格小于左边界。

给你一颗小瓜子的博客 1096

NC105—二分查找

题意 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 题解 其实就是求左边界 class Solution { public: /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a int整型vector 有序数组 * @return int整型 */ int upper_bou

fkuner的博客 161

0二分查找简单 牛客NC.105二分查找

二分查找 百度简单 在二分查找的基础上分为如下三种情况: 1.v大于a[mid],有可能存在,也有可能不存在,更新左右边界。 2.v小于等于a[mid]且满足第一个大于等于v的条件,直接返回结果 3.v小于等于a[mid]但不满足第一个大于等于v的条件,更新左右边界。 import java.util.*; public class Solution { public int upper_bound_ (int n, int v, int[] a) { int left = 0,

31楼下小黑的博客 295

牛客-NC105-二分查找-II

NC105. 二分查找-II(medium)方法一:递归二分(自己写的)方法二:纯二分 方法一:递归二分(自己写的) 思路:题目已经给出解题思路:二分查找,但这里需要注意限制条件:首次出现的位置,不可避免地,我们需要递归去二分查找target。当找到时,需要考虑在当前mid的左边可能还有更小的,所有我们需要再递归调用左边。 import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规

dingzhi4469的博客 251

NC105 二分查找-Ⅱ

NC105 二分查找-II 这个b站的视频对于二分的边界情况说明的很清楚,推荐观看学习。 二分查找为什么总是写错?–bilibili 这里的题目可以参考 找到第一个 大于等于 target 的元素 IsBlue 的条件为 < target,小于的都是蓝色,大于等于的都是红色,最后返回红色边界,也就是返回 r 特判:但是这个target有可能在nums数组中不存在,在返回之前还需要判断数组下标为r的值是否等于 target 如果不等于则说明target不在数组中,返回 -1;否则直接返回 r

pingting_的博客 276

牛客题霸NC105题解

二分查找 牛客题霸NC105 难度:Easy 题目描述 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 示例 输入 5,4,[1,2,4,4,5] 返回值 3 说明 输出位置从1开始计算 题目答案 很简单的二分查找,关键看三个地方就行了: low < high 还是low <= high mid是左倾还是右倾 向左收缩条件及向右收缩条件 import java.util.*; public cla

nuolve3993的博客 643

NC105_二分查找

NC105_二分查找 知识点:二分查找 题目链接 题目描述 请实现有重复数字的升序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数(指不存在大于等于查找值的数),则输出数组长度加一。 输入: 5,4,[1,2,4,4,5] 输出: 3 备注: 输出位置从1开始计算 解题思路 找到什么样的一定不是结果 如果比v小 一定不是结果 left = mid+1 如果大于等于v 因为存在重复数字 所以还是要往左边找 代码 #include "cheader.h" class Sol

cjl的博客 223
上一篇: NC 78: 反转链表
下一篇: NC88 寻找第K大
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值