当前位置: 首页 > news >正文

算法——二分查找

介绍

二分查找是一个高效的查找算法,查找算法还有线性查找,它的时间复杂度为 O ( n ) O(n) O(n),但二分查找的时间复杂度为 l o g ( n ) log(n) log(n)(因为是2分,所以此处的log是以2为底的对数函数)。

注:本文提到的查找都是无重复元素的,要是有重复元素,就比较麻烦了。

线性查找

思想

从数组的头部向尾部遍历,如果找到就返回它的下标,如果遍历完还找不到就返回-1。

代码

class Solution {public int linearSearch(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {if (nums[i] == target) {return i;}}return -1;}
}

二分查找

前提

数组是有序的,一般要求数组为升序排列,也就是从小到大排列。

思想

二分查找的核心思想就是分治就是将一个问题划分为多个子问题,就是将最小的子问题解决。比如说有一堆苹果,要想吃完这堆苹果(解决一个大问题),就得先将这堆苹果分成很多堆(将问题划分为子问题),直到每堆只剩一个苹果(划分到了最小的子问题),然后再一个一个地将苹果吃掉(将最小的子问题解决)。

现在理解二分查找,二分查找就是找到升序的数组的中间元素,然后比较中间元素与目标元素的大小,如果目标元素等于中间元素,则直接返回中间元素的下标;如果目标元素大于中间元素,就去右子区间查找;否则就去左子区间查找。直到找到目标元素无法再找为止(无法再找指的是区间的长度小于1)。注意,如果数组是降序的,则策略与此恰好相反。

由于二分查找每次都将待查找区间缩小为上一个待查找区间的一半,所以它的时间复杂度为 O ( l o g n ) O(logn) O(logn)

代码

class Solution {public int binarySearch(int[] nums, int target) {// nums一定要有序,如果没有序,就先使用Arrays.sort(nums);将nums按升序排列int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left >> 1);if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;}
}
http://www.lryc.cn/news/366787.html

相关文章:

  • 统计信号处理基础 习题解答10-8
  • Flutter打包网络问题解决办法
  • 【ARM Cache 及 MMU 系列文章 6.3 -- ARMv8/v9 Cache Tag数据读取及分析】
  • Lua移植到标准ANSI C环境
  • crossover软件安装程序怎么安装 Crossover for Mac切换Windows系统 crossover软件怎么样
  • 【2024高考作文】新课标I卷-人工智能主题,用chatGPT作答
  • 【计算机网络】P2 计算机网络体系结构基本概念,涉及分层的基本术语、SDU、PCI 与 PDU 的概念以及层次结构的含义
  • 主流物联网协议客户端开源库介绍(mqtt,coap,websocket,httphttps,tcp及udp)
  • 【Python】成功解决SyntaxError: invalid syntax
  • 源代码防泄密
  • Unity DOTS技术(十三) ComponentSystem及JobComponentSystem
  • Apifox的使用
  • 【SpringBoot】SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列
  • kafka消息积压处理方案
  • 【vscode-快捷键 一键JSON格式化】
  • 什么是 Spring Boot 的起步依赖和自动配置?它们的作用是什么?
  • rk3568 norflash+pcei nvme 配置
  • 【Vue】面经基础版-首页请求渲染
  • OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流
  • ch1计算机网络和因特网
  • Web前端安全测试:深入剖析与实战策略
  • Java学习-JDBC(一)
  • 异步复位和同步释放
  • 03-3.2.4 双端队列
  • SpringBoot的Mapper文件什么时候需要使用@Param注解
  • 2024.6.8
  • 室内外融合定位是如何做到成为定位领域的新宠
  • 【刷题篇】分治-归并排序
  • 【经验】Ubuntu上离线安装VsCode插件浏览Linux kernel源码
  • 鼠标侧键映射虚拟桌面切换 —— Win11