代码随想录:二分查找相关题目推荐(35、34)

35.搜索插入位置

题目

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

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

代码(暴力遍历)

class Solution {
    public int searchInsert(int[] nums, int target) {
        for(int i = 0; i < nums.length; i++){
            if(nums[i] >= target){
                return i;  //在数组最前面or直接找到or在某个数后面插入
            }
        }
        return nums.length;  //target最大,插入数组后面
    }
}

代码(二分查找标准版)

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid;
        while(left <= right){
            mid = left + (right - left)/2;
            if(target < nums[mid]){
                right = mid - 1;
            }
            else if(target > nums[mid]){
                left = mid + 1;
            }
            else{
                return mid;
            }
        }
        return right + 1;  //right指向待插入元素的前一个索引位置
    }
}

代码(二分查找自己写的)

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid;
        int index = -1;  //返回结果,必须要初始化,-1可以改成别的数

        while(left <= right){
            //特殊情况1:target在最前面插入
            if(target < nums[left]){
                index = left;  //插在最小值left位置
                break;
            }
            //特殊情况2:target在最后面插入
            if(target > nums[right]){
                index = right + 1;  //插在最大值right后面位置,不要忘+1
                break;
            }
            //二分查找逻辑
            mid = left + (right - left) / 2;
            if(target < nums[mid]){
                right = mid - 1;
            }
            else if(target > nums[mid]){
                left = mid + 1;
            }
            else{
                index = mid;  //找到了查找元素
                break;
            }
        }
        return index;
    }
}

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

题目

给你一个按照非递减顺序排列的整数数组 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]

代码(两个二分查找)

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int start = getleft(nums,target);
        int end = getright(nums,target);
        //target在数组的最前面和最后面
        if(start == -2 || end == -2){
            return new int[]{-1,-1};
        }
        //有target这个数,长度大于1,返回找到的区间
        if(end - start > 1){
            return new int[]{start+1,end-1};
        }
        //target在数组区间内,但找不到,长度小于等于1
        else{
            return new int[]{-1,-1};
        }
        
    }
    public int getleft(int[] nums,int target){
        int left = 0;
        int right = nums.length - 1;
        int mid;
        int start = -2; //左边界
        while(left <= right){
            mid = left + (right - left) / 2;
            if(target > nums[mid]){
                left = mid + 1;
            }
            else if(target <= nums[mid]){
                right = mid -1;
                start = right;
            }
        }
        return start;
    }
    public int getright(int[] nums,int target){
        int left = 0;
        int right = nums.length - 1;
        int mid;
        int end = -2; //右边界
        while(left <= right){
            mid = left + (right - left) / 2;
            if(target < nums[mid]){
                right = mid - 1;
            }
            else if(target >= nums[mid]){
                left = mid + 1;
                end = left;
            }
        }
        return end;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】Vue packages version mismatch(vue 和 vue-template-compiler)

报错&#xff1a;Vue packages version mismatch 原因&#xff1a;vue和vue-template-compiler版本不一样解决&#xff1a;如上vue版本为 2.6.14&#xff0c;vue-template-comiler版本为2.7.16。将vue-template-comiler版本设置为和vue版本一致即可。 npm install vue-templat…

神经网络极简入门

神经网络是深度学习的基础&#xff0c;正是深度学习的兴起&#xff0c;让停滞不前的人工智能再一次的取得飞速的发展。 其实神经网络的理论由来已久&#xff0c;灵感来自仿生智能计算&#xff0c;只是以前限于硬件的计算能力&#xff0c;没有突出的表现&#xff0c;直至谷歌的A…

响应式编程Spring Reactor探索

一&#xff0c;介绍 响应式编程&#xff08;Reactive Programming&#xff09;&#xff0c;简单来说是一种生产者只负责生成并发出数据/事件&#xff0c;消费者来监听并负责定义如何处理数据/事件的变化传递方式的编程思想。 响应式编程借鉴了Reactor设计模式&#xff0c;我们…

神器:jQuery一键转换为纯净JavaScript代码

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 该工具将 jQuery 代码转换为现代、高效的 JavaScript。它允许您用纯 JavaScript 替换 jQuery&#xff0c;同时保持原始代码不变。 虽然 jQuery 一直是 Web 开发中…

防火墙技术基础篇:什么是包过滤技术

什么是防火墙包过滤技术 当数据在网络中传输时&#xff0c;它们被分割成小的单元&#xff0c;称为数据包。防火墙的包过滤是一种基本的网络安全技术&#xff0c;用于检查这些数据包并根据预定义的规则决定是否允许它们通过防火墙。 防火墙包过滤是一种关键的网络安全技术&am…

在下游市场需求带动下 轮胎模具市场规模逐渐扩大

在下游市场需求带动下 轮胎模具市场规模逐渐扩大 轮胎模具是通过硫化、成型等工序生产各种轮胎的一种工具。轮胎模具是生产轮胎的关键设备之一&#xff0c;其性能直接影响到轮胎的耐用性和安全性。根据花纹加工工艺不同&#xff0c;轮胎模具加工工艺可分为精密铸造工艺、数控雕…

炒美股怎么开户?

近年来&#xff0c;随着国内投资者对境外投资需求的不断增长&#xff0c;炒美股逐渐成为许多投资者的选择。然而&#xff0c;随着监管政策的不断完善&#xff0c;传统的互联网券商开户方式已经不再适用。那么&#xff0c;对于想要入场美股市场的投资者来说&#xff0c;该如何开…

实现左上角的固定视口但是网格以图片中心放大缩小

仅仅修改了showbk&#xff08;&#xff09; 函数部分&#xff0c;增加bkv4 直接采样&#xff0c;然后粘贴到左上角&#xff0c;实现多余部分裁剪&#xff0c;形成视口内放大缩小 // 程序&#xff1a;2D RPG 地图编辑器与摄像机追随 // 作者&#xff1a;bilibili 民用级脑的研发…

windows10打印机共享完美解决方案

提到文件共享大家并不陌生,相关的还有打印机共享,这个多见于单位、复印部,在一个区域网里多台电脑共用一台打印机,打印资料非常方便,就包括在家里,我们现在一般都会有多台电脑或设备,通过家庭网络联接,如果共享一台打印机的话也是件便捷的事。 但是随着操作系统的更新…

Win11任务栏通知很不明显的解决方案

Win11流行起来后&#xff0c;不少用户抱怨Win11的任务栏通知闪烁的颜色很不明显&#xff0c;经常微信来消息了看不到。虽然有右下角的微信图标会闪烁&#xff0c;但是提醒舒适度还是觉得不如Win10舒服显眼。 默认的颜色是这样子的&#xff0c;可以看得出Win11的任务栏提醒颜…

QGraphicsItem的prepareGeometryChange 和 update方法区别

prepareGeometryChange 这个函数用于为图形的几何形状变化做准备。在改变一个项目的边界矩形之前调用此函数&#xff0c;以保持 QGraphicsScene 的索引是最新的。如果必要的话&#xff0c;prepareGeometryChange() 会调用 update()。QGraphicsScene认为所有图元的boundingRect…

Python数据分析常用模块的介绍与使用

Python数据分析模块 前言一、Numpy模块Numpy介绍Numpy的使用Numpy生成数组ndarrayarray生成数组arange生成数组random生成数组其他示例 关于randint示例1示例2 关于rand Numpy数组统计方法示例 二、Pandas模块pandas介绍Series示例 DataFrame示例 三、其他模块Matplotlib/Seabo…

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…

【Qt】Qt开发中常用命名规范、快捷键和窗口坐标体系详解

Qt是一款强大的跨平台C应用程序开发框架&#xff0c;为了提高代码的可读性和可维护性&#xff0c;遵循一定的命名规范是非常重要的。此外&#xff0c;Qt Creator提供了许多快捷键和便捷功能&#xff0c;能够提高开发效率。本文将介绍Qt开发中常用的命名规范、快捷键以及窗口坐标…

来聊聊Java项目分层规范

写在文章开头 近期和读者交流聊到项目规范&#xff0c;借着这个机会我们不妨聊聊主流Java项目是如何进行分层的。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专家 &#xff0c;也是开源项目 Java Guide 的维…

[华为OD]C卷 运输时间 200 动态规划

题目&#xff1a; M辆车需要在一条不能超车的单行道到达终点&#xff0c;起点到终点的距离为N。速度快的车追上前车 后&#xff0c;只能以前车的速度继续行驶&#xff0c;求最后一车辆到达目的地花费的时间。 注意&#xff1a; 每辆车固定间隔1小时出发&#xff0c;比如第…

静态NAT

哈喽&#xff01;各位小伙伴们好久不见&#xff0c;最近由于工作的原因断更了一段时间&#xff0c;不过最近我都会把这些给补上&#xff0c;今天我们来学习一个简单的知识——静态NAT转换。 第一章 什么是NAT技术&#xff1f; 网络地址转换技术NAT&#xff08;Networ…

红帽发布Red Hat Enterprise Linux AI(RHEL AI)

红帽 2024 峰会正在科罗拉多州丹佛市举行…鉴于当前的时代背景&#xff0c;人工智能&#xff08;AI&#xff09;在此次峰会上占据了重要位置&#xff0c;因此红帽公司&#xff08;Red Hat&#xff09;也不甘人后宣布推出 RHEL AI。 红帽公司今天发布了 Red Hat Enterprise Lin…

优化电脑空间清理电脑占用磁盘空间垃圾

1. 清理磁盘 右下角放大镜&#xff0c;搜索 此电脑 点击要清理的磁盘 &#xff0c;比如点击C盘&#xff0c;右键属性&#xff0c;常规选项卡&#xff0c;点击清理磁盘&#xff0c; 和点击清理系统文件 1.1 优化磁盘 右下角放大镜&#xff0c;搜索 此电脑 点击要清理的磁盘 &…

RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…
最新文章