【数据结构刷题专题】——二分查找

二分查找

二分查找模板题:704. 二分查找
二分查找前提:

  • 有序数组
  • 数组中无重复元素

左闭右闭:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) {
            int mid = left + ((right - left) / 2);
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else return mid;
        }
        return -1;
    }
};

左闭右开

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();
        while (left < right) {
            int mid = left + ((right - left) / 2);
            if (nums[mid] > target) {
                right = mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else return mid;
        }
        return -1;
    }
};

时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)
二分查找拓展题:
【1】35.搜索插入位置
在这里插入图片描述
有两种情况考虑:

  1. 在数组中:二分查找
  2. 不在数组中:
  • 所有数之前
  • 在某两数之间
  • 在所有数之后

而不在数组中即在二分查找的基础上改变退出循环后返回的值
二分查找退出循环时,左闭右闭left=right+1,左闭右开left=right

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] > target) right = mid - 1;
            else if (nums[mid] < target) left = mid + 1;
            else return mid;
        }
        return right + 1;
    }
};

时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)

【2】69. x 的平方根

class Solution {
public:
    int mySqrt(int x) {
        int left = 0; int right = x;
        while (left <= right) {
            int mid = (left + right) / 2;
            if ((long long)mid * mid > x) right = mid - 1;
            else if ((long long)mid * mid < x) left = mid + 1;
            else return mid;
        }
        return right;
    }
};

【3】367. 有效的完全平方数

class Solution {
public:
    bool isPerfectSquare(int num) {
        int left = 0; 
        int right = num;
        while (left <= right) {
            int mid = (left + right) / 2;
            if ((long long)mid * mid > num) right = mid - 1;
            else if ((long long)mid * mid < num) left = mid + 1;
            else return true;
        }
        return false;
    } 
};

【4】34. 在排序数组中查找元素的第一个和最后一个位置
两次二分,定义新变量first、last

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.size() == 0) return vector<int>{-1, -1};
        int left = 0;
        int right = nums.size() - 1;
        int first = -1; int last = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] > target) right = mid - 1;
            else if (nums[mid] < target) left = mid + 1;
            else {
                first = mid;
                right = mid - 1;
            }
        }
        left = 0;
        right = nums.size() - 1;
        while (left <= right) {
            int mid = (left + right + 1) / 2;
            if (nums[mid] > target) right = mid - 1;
            else if (nums[mid] < target) left = mid + 1;
            else {
                last = mid;
                left = mid + 1;
            }
        }
        return vector<int>{first, last};
    }
};

【5】74. 搜索二维矩阵
二维转一维

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        int n = matrix[0].size();
        int left = 0;
        int right = m * n - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            int x = matrix[mid / n][mid % n];
            if (x > target) right = mid - 1;
            else if (x < target) left = mid + 1;
            else return true;
        }
        return false;
    }
};

【6】33. 搜索旋转排序数组
通过二分找到旋转点,在区间内部二分找到目标值
在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if (nums.size() == 0) return -1;
        if (nums.size() == 1) {
            if (nums[0] == target) return 0;
            else return -1;
        }
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) return mid;
            if (nums[left] <= nums[mid]) {
                if (nums[left] <= target && nums[mid] >= target) right = mid - 1;
                else left = mid + 1;
            } else {
                if (nums[right] >= target && nums[mid] <= target) left = mid + 1;
                else right = mid - 1;
            }
        }
        return -1;
    }
};

【7】153. 寻找旋转排序数组中的最小值

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] < nums[right]) right = mid;
            else if (nums[mid] > nums[right]) left = mid + 1;
            else return nums[mid];
        }
        return nums[left];
    }
};

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

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

相关文章

​CC-EasyCommonInput: 基于uni-app原生input组件封装的增强实用输入框组件

CC-EasyCommonInput&#xff1a;基于uni-app原生input组件封装的增强实用输入框组件 摘要&#xff1a; 在前端开发中&#xff0c;输入框&#xff08;Input&#xff09;是一个常见的UI组件&#xff0c;用于获取用户输入的数据。然而&#xff0c;为了满足不同的业务需求和用户体验…

LED显示屏视频播放器的8大功能

随着中国LED显示屏企业的规模发展和产品技术的不断创新&#xff0c;LED显示屏在各个领域中的应用得到了广泛推广。然而&#xff0c;LED显示屏的出色表现离不开LED视频播放器这一关键设备的支持。下面将介绍LED视频播放器的8大功能&#xff0c;以及它们如何提升LED显示屏的显像效…

VSCode最强插件合集,助你代码开发效率翻倍!

大家好&#xff0c;我是宝哥。 今天给大家推荐14个VSCode靠前的编程辅助插件&#xff0c;它们可以帮助你提高代码编写、调试、阅读和管理效率。 1.ESLint 简介&#xff1a;用于检查JavaScript代码的语法和风格错误。 功能特色&#xff1a;支持多种规则&#xff0c;可以自定义规…

stdlib.h中的 atoi 函数

记忆方法&#xff1a; atoi可以理解为 arr to int 表示将char类型的字符串转换成int类型的整数。例如"1234"转换成 1234。 传入值传出值&#xff1a;int atoi(char* arr); 将arr里面的字符型数字转变成整形数字。函数开始会跳过除了0到9的数字字符&#xff0c;…

STM32初识3

中断和事件 什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的 程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行。 什么是EXTI&#xff1f; …

【办公类-16-07-08】“2023下学期 大班户外游戏2(做成打印用的的贴墙版样式--A4横版撑满)”(python 排班表系列)

背景需求&#xff1a; 运用代码做出了中班每个班级用的户外游戏&#xff08;新版&#xff09;的表格&#xff08;包含有场地的贴墙版和无场地的贴周计划版&#xff09; 【办公类-16-07-07】“2023下学期 大班户外游戏2&#xff08;有场地和无场地版&#xff0c;每天不同场地&…

部署prometheus 监控k8s集群

目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP&#xff1a;31940 部署k8集群…

【Linux】线程的概念{虚拟地址堆区细分/缺页中断/页/初识线程/创建线程/优缺点}

文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写…

Ps:色彩平衡

色彩平衡 Color Balance命令可改变阴影、中间调、高光中的颜色平衡&#xff0c;从而改善图像的整体色彩表现或为图像创造特定的氛围。 Ps菜单&#xff1a;图像/调整/色彩平衡 Adjustments/Color Balance 快捷键&#xff1a;Ctrl B Ps菜单&#xff1a;图层/新建调整图层/色彩平…

飞桨ONNX推理部署初探

ONNX&#xff0c;全称Open Neural Network Exchange&#xff08;开放神经网络交换&#xff09;&#xff0c;是一个用于表示深度学习模型的标准&#xff0c;它定义了一组与环境、平台均无关的标准格式。这使得不同的人工智能框架&#xff0c;如飞桨、MXNet等&#xff0c;可以采用…

【Vue】Vue集成Element-UI框架

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;Vue集成Element-UI框架 &#x1f3c6;系列专栏&#xff1a;从0开始的Vue之旅 文章目录 Element-UI简介安装Element-UInpm安装CDN安装 引入Element-UI测试是否引入成功总结 Element-UI简介 Element-UI官网&#xff1a;点…

划线铸铁平台是怎样进行人工采刮的——北重

划线铸铁平台是一种用于进行平整和划线的工具。它通常由铸铁制成&#xff0c;表面平整且耐用。人工采刮是一种在平台上使用刮刀进行刮擦的方法&#xff0c;以平整和划线。 以下是人工采刮的步骤&#xff1a; 1. 准备平台&#xff1a;确保划线铸铁平台表面清洁&#xff0c;没有…

多级页表查询

说明一下这个三级页表的查询&#xff0c;会需要上面的L2,L1,L0 如果在二级页表level就是2&#xff0c;PGSHIFT是12&#xff0c;那么就是往左移129*2位置&#xff0c;在&9bit就得到L2&#xff0c;其他以此类推 也表查询&#xff0c;首先有跟页表的地址pagetable&#xff0c;…

【计算机视觉】Gaussian Splatting源码解读补充(一)

本文旨在补充gwpscut创作的博文学习笔记之——3D Gaussian Splatting源码解读。 Gaussian Splatting Github地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 论文地址&#xff1a;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gauss…

JavaWeb -- HTTP -- WEB服务器TOMCAT

一.HTTP介绍: HTTP(Hyper Text Protocol) 实际上是一种超文本传输的协议,规定了浏览器跟服务器之间的一些数据传输的规则 例如B/S 对于浏览器的请求,以及相应服务器的响应,都必须依靠这种协议,规范,才能够彼此之间相互 理解 HTTP的协议特点: 1.基于TCP协议: 面向连接 更加安全…

抖音视频无水印爬虫下载工具|视频关键词批量采集软件

抖音视频批量下载工具 最新推出的抖音视频批量下载工具&#xff0c;针对市面上单个视频链接提取不方便的问题进行了全新设计&#xff0c;不仅可以通过单个视频链接提取&#xff0c;还可通过关键词进行视频搜索&#xff0c;实现批量和有选择性的提取功能。 操作说明 您可以通过…

牛客题霸-SQL篇(刷题记录二)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 以下内容是…

基于ssm的音乐视频网站系统(可听音乐和看视频+数据库+报告+免费远程调试

项目介绍: 基于ssm的音乐视频网站系统&#xff08;可听音乐和看视频&#xff09;。Javaee项目&#xff0c;ssm项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Myba…

sd卡受损怎么恢复数据,sd卡受损了里面的数据怎么办

sd卡受损怎么恢复数据?听说你的SD卡出问题了?失去珍贵数据,简直就像是失去了一段珍贵的回忆,但别灰心,我们来解决这个问题!首先,我得说,SD卡受损是很常见的情况,可能是不小心摔了一下、插拔不当,或者是遇到了某种不可抗力的情况。sd卡受损了里面的数据怎么办?幸运的…

Linux--Flappy_bird实现

代码实现&#xff1a; #include<stdio.h> #include<curses.h> #include<signal.h> #include<sys/time.h> #include<stdlib.h>#define BIRD #define BLANK #define PIPE /**定义管道结构体**/ typedef struct Pipe {int x;//列int y;//横struc…