算法(二)二分查找

文章目录

  • 二分查找简介
  • 实现方式
    • 循环方式
    • 递归方式
  • 经典例子

二分查找简介

  • 二分查找(binary search)算法,也叫折半算法。
  • 二分查找是针对有序的数据集合的查找办法,如果是无序的数据结合就使用遍历。
  • 二分查找之所以快速,是因为它再匹配不成功的时候,每次都能排除剩余元素中一半的元素,因此包含目标元素的有效范围就会收缩非常快。
  • 时间复杂度: T(n) = O(logn)
    在这里插入图片描述

实现方式

循环方式

package com.xxliao.algorithms.binary_search.demo;/*** @author xxliao* @description: 在一个有序集合中,查找某数是否存在 -- 基础实现* @date 2024/5/30 0:40*/
public class Demo01 {public static void main(String[] args) {//有序数组int[] nums = {3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};System.out.println(binarySearch(nums,66));System.out.println(binarySearch(nums,55));}/*** @description  二分法基础实现* @author  xxliao* @date  2024/5/30 0:47*/public static int binarySearch(int[] array,int destNum) {// 低索引int low = 0;// 高索引int high = array.length -1;// 中间索引int mid = 0;while(low<=high) {mid = (low + high) / 2;if(array[mid] == destNum) {return mid; //相等,找到该索引}else if(destNum < array[mid]){high = mid - 1; // 比中间值小,}else{low = mid + 1; // 比中间值大}}return -1;}
}

测试结果:
在这里插入图片描述

递归方式

package com.xxliao.algorithms.binary_search.demo;/*** @author xxliao* @description: 在一个有序集合中,查找某数是否存在 -- 递归实现* @date 2024/5/30 0:40*/
public class Demo02 {public static void main(String[] args) {//有序数组int[] nums = {3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};System.out.println(binarySearch(nums,48));System.out.println(binarySearch(nums,55));}/*** @description  二分法 递归实现* @author  xxliao* @date  2024/5/30 0:47*/public static int binarySearch(int[] array,int destNum) {// 低索引int low = 0;// 高索引int high = array.length -1;return binarySearch(array,low,high,destNum);}private static int binarySearch(int[] array,int low,int high,int destNum){//定义递归结束条件if(low > high)return -1;int mid = (low + high) / 2;if(array[mid] == destNum) {return mid; //相等,找到该索引}else if(destNum < array[mid]){high = mid - 1; // 比中间值小,}else{low = mid + 1; // 比中间值大}return binarySearch(array,low,high,destNum);}
}

测试结果:
在这里插入图片描述

经典例子

一个有序数组有一个数出现1次,其他数出现2次,找出出现一次的数
比如:1 1 2 2 3 3 4 4 5 5 6 6 7 出现1次的数是7。

使用二分查找: 1 有序、 2、时间复杂度 O(logn)。
偶数位索引跟后面的比相同,奇数位索引跟前面的比相同 则说明前面的都对。
偶数位索引跟前面的比相同,奇数位索引跟后面的比相同 则说明后面的都对。

package com.xxliao.algorithms.binary_search.demo;/*** @author xxliao* @description:* 一个有序数组有一个数出现1次,其他数出现2次,找出出现一次的数* 比如:1 1 2 2 3 3 4 4 5 5 6 6 7 出现1次的数是7** 使用二分查找: 1 有序、 2、时间复杂度 O(logn)* 偶数位索引跟后面的比相同,奇数位索引跟前面的比相同 则说明前面的都对* 偶数位索引跟前面的比相同,奇数位索引跟后面的比相同 则说明后面的都对** @date 2024/5/30 1:06*/public class Demo03 {public static void main(String[] args) {int[] nums={1,2,2,3,3,4,4,5,5};//int[] nums = {1,1, 2, 2, 3, 4, 4, 5, 5,6,6,7,7};System.out.println(binarySearch(nums));}public static int binarySearch(int[] nums) {//低位索引int low = 0;//高位索引int high = nums.length - 1;//中间索引int mid = 0;while (low < high) {mid = (low + high) / 2;if (mid % 2 == 0) {//偶数位if (nums[mid] == nums[mid + 1]) {// 与后面的数相等,前面的都对low = mid + 1;} else if (nums[mid] == nums[mid - 1]) {// 与前面的数相等,后面的都对high = mid - 1;} else {// 就是这个数return nums[mid];}} else {//奇数位if (nums[mid] == nums[mid - 1]) {// 与前面的数相等,前面的都对low = mid + 1;} else if (nums[mid] == nums[mid + 1]) {//与后面的数相等,后面的都对high = mid - 1;} else { // 就是这个数return nums[mid];}}}//low=highreturn nums[low];}
}

测试结果:
在这里插入图片描述

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

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

相关文章

OWASP top10--SQL注入(四、sqlmap安装及使用)

目录 sqlmap工具安装&#xff1a; 工具说明&#xff1a; 主要功能特性包括&#xff1a; 基本使用示例&#xff1a; 先下载python2.7.9版本 sqlmap运行 sqlmap工具使用 -u -r –-levelLEVEL扫描深度级别 --riskRISK 执行测试的风险 -threads 线程数 -batch-smart智能…

鸿蒙开发加强2

快速创建一个符合长度的数组 空数组 Array.from({length: 200}) // 200的长度的空数组 场景&#xff1a;只确定长度&#xff0c;不确定内容的情况 State 状态装饰器 》增强功能 数据变化了 可以引起页面的重新渲染 没有State修饰的变量&#xff0c;不会引起UI的刷新渲染 加…

fintuning chatglm3

chatglm3介绍 ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型&#xff0c;在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上&#xff0c;ChatGLM3-6B 引入了如下特性&#xff1a; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用…

ic基础|时钟篇06:crg到底是什么?一文带你了解crg中的时钟系统!

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

基于Swing和socket实现双向通讯案例

server代码&#xff1a; import javax.swing.*; import java.awt.*; import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class Server extends JFrame {private JTextArea messageArea;private JTextField textField;private PrintWriter write…

像艺术家一样工作:前言

名人名言 “艺术是盗窃” —— 巴勃罗毕加索 “不成熟的诗人模仿&#xff0c;成熟的诗人偷窃&#xff1b;对于偷窃得到的艺术&#xff0c;坏的诗人丑化它&#xff0c;好的诗人加入自己的理解&#xff0c;使它变得更好&#xff0c;至少会让它有点不同。最优秀的诗人&#xff0…

After Effects 2022(AE2022)支持win版和mac版下载

​After Effects 2022 是由Adobe公司推出的一款专业视频后期制作软件&#xff0c;它主要用于视频合成、视频特效制作、视频剪辑、动画制作等领域。After Effects 2022 内置了丰富的特效和过渡效果&#xff0c;用户可以通过它进行高级的视频合成和动画制作。 该软件具有直观的用…

一文搞懂分布式事务Seta-AT模式实现原理

分布式事务概念 分布式事务&#xff08;Distributed Transaction&#xff09; 是指在分布式系统中&#xff0c;涉及多个数据库、服务、消息队列等资源&#xff0c;并且需要保证这些资源上的操作要么全部成功提交&#xff0c;要么全部失败回滚的一种机制。在分布式系统中&#…

IO流---字节流.Java

一&#xff0c;概述 IO流是存储和读取数据的解决方案。 I&#xff1a;input O:output流&#xff1a;像水流一样传输数据 因为IO流与File是息息相关的&#xff0c;所以在学习IO流之前&#xff0c;简单回顾一下File&#xff1a;&#x1f604;&#x1f60a;&#…

python对文本操作,生成可执行文件

.exe文件主要包含pingmianF.py文件和read_inp_auto.py文件 实现效果 代码 read_inp_auto.py #-*- coding: utf-8 -*- import re import sys import os import os.path import time import pingmianF from pingmianF import vector import numpy as np from tkinter import me…

GDPU JavaWeb EL与JSTL

标签化&#xff0c;可以简化百分号的繁忙。 标签库配置 先下载好jstl标签库&#xff0c;然后放到lib。接着&#xff0c;要让编译器识别到&#xff0c;因此要在模块配置依赖&#xff0c;这里导jar包都得注意一下模块依赖。 也可以在libraries项目库设置。 EL与JSTL查询图书 在…

2024华为OD机试真题-攀登者1-C++(C卷D卷)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。 其中数组元素0代表地面。 例如: [0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图, 地图中有两个山脉位置分别为1,2,3,4,5 …

设计模式(十)结构型模式---享元模式

文章目录 享元模式简介结构UML图具体实现UML图代码实现 享元模式简介 享元模式&#xff08;fly weight pattern&#xff09;主要是通过共享对象来减少系统中对象的数量&#xff0c;其本质就是缓存共享对象&#xff0c;降低内存消耗。享元模式将需要重复使用的对象分为两个状态…

大学生Python自救课程总结

因为一些事情的缘故&#xff0c;我已经几乎没有更新很久了&#xff0c;然后现在快到期末了&#xff0c;不知道各位学习python的同志们慌不慌【坏笑】。 本学期&#xff0c;我只是简单的讲了讲python的基础用法。当然&#xff0c;可能有些地方总结的并不全面&#xff0c;很多知…

MyBatis中的接口代理机制及其使用

1. MyBatis中的接口代理机制及其使用 文章目录 1. MyBatis中的接口代理机制及其使用2. 实操2.1 准备工作2.2 insert 增加操作2.3 delete 删除操作2.4 update 修改操作2.5 select 查询一条记录操作2.6 select 查询多条记录操作 3. 总结&#xff1a;4. 最后&#xff1a; MyBatis …

HackTheBox-Machines--Nineveh

Nineveh测试过程 1 信息收集 NMAP 端口扫描 80 端口 80端口是服务器的默认页面&#xff0c;无可利用功能点&#xff0c;源代码没有可利用的敏感信息 目录扫描 1.http://10.129.25.123/department 访问/department目录跳转到登录页面&#xff0c;尝试暴力破解&#xff0c;获取…

嵌入式期末复习

一、选择题&#xff08;20&#xff09; 二、判断题&#xff08;10&#xff09; 三、填空题&#xff08;10&#xff09; 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…

NVIDIA NeMo - 训练本地化多语种 LLM

本文转载自&#xff1a;使用 NVIDIA NeMo 训练本地化多语种 LLM &#xff08;2024年 5月 17日 By Nicole Luo and Amit Bleiweiss 第 1 部分 https://developer.nvidia.com/zh-cn/blog/training-localized-multilingual-llms-with-nvidia-nemo-part-1/ 第 2 部分 https://deve…

Cocos入门2:软件安装

Cocos Creator的安装教程如下&#xff0c;按照步骤进行&#xff0c;可以帮助您顺利安装Cocos Creator&#xff1a; 一、下载Cocos Dashboard 访问Cocos官网&#xff1a;前往Cocos Creator的官方网站&#xff08;https://www.cocos.com/creator/&#xff09;。 下载Cocos Dash…

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介)

重生之 SpringBoot3 入门保姆级学习&#xff08;14、内容协商基础简介&#xff09; 3.3 内容协商3.3.1 基础简介3.3.2 演示效果 3.3 内容协商 3.3.1 基础简介 默认规则 基于请求头的内容协商&#xff08;默认开启&#xff09; 客户端向服务器发送请求&#xff0c;携带 HTTP 标…