一种效率较高的查找方法(效率最高的查找方法)

本文分享自华为云社区《》,作者: i进击的攻城狮 。

一、二分查找概述

二分查找是一种相比于逐个查找,性能更加优秀,时间复杂度更低的一种算法。

二分查找的思路是,对一个顺序的集合,确定查找区间的左右边界,再根据左右边界,计算出中间的值,再和中间值进行比较,如果左边界大于中间值,左边界向右移动到中间值+1的位置,反之右边界移动的中间值左边的位置。

示例一:
输入: nums = [-1,0,3,5,9,12], target = 9

一种效率较高的查找方法(效率最高的查找方法)

输出: 4
解释: 9 出现在 nums 中并且下标为 4

首先左边界left是0,右边界right是5,

mid中间值计算公式是:

**(右-左) / 2 + 左 **= (5-0)/2 + 0 = 2.5,向下取整为2。

这里要注意,一般二分查找中,mid中间下标计算结果是小数,都是向下取整。

nums[2] = 3;

3 小于目标 9,可以判断目标值在右区间。

左 = 中 + 1;

left改变后重新计算下标,计算中间下标值是:

(5-3)/2 +3 = 4;此时数[4] = 9;

找到目标值。

代码如下

class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length-1;
while (l<=r){
int m = (r-l)+l;
if (nums[m]==target){
return m;
}else if (target<nums[m]){ r="m-1;" }else="" {="" l="m+1;" }="" return="" -1;="" }

二、分查找解决算法问题

二分查找并不是只是简简单单的去判断一个数组中,是否存在目标值,它是一种解决问题的思想。二分查找能衍生出一些算法问题。接下来由如下三个模板,去了解如何用二分查找去解决问题。

2.1 模板I(标准模板)

int binarySearch(int[] nums, int target){
if(nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
while(left <= right){
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if(nums[mid] == target){ return mid; }
else if(nums[mid] < target) { left = mid + 1; }
else { right = mid - 1; }
}
// End Condition: left > right
return -1;
}

模板1是二分查找的最基础和最基本的形式。这是一个标准的二分查找模板,大多数高中或大学会在他们第一次教学生计算机科学时使用。模板 1 用于查找可以通过访问数组中的单个索引来确定的元素或条件。

在这个模板中,left和right会不断靠近,最后一次遍历的时候,两个值left和right会相等。

x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:
输入:x = 4
输出:2

思路

在从1到x中寻找x的平方根,如果mid的平方大于x,那么right = mid - 1 同理,反之就是left = mid + 1

代码:

public int mySqrt(int x) {
if (x==0){return 0;}
if (x==1){return 1;}
int l = 0;
int r = x;
while(l<=r){
int m = (r-l)/2+l;
if (x/m==m){
return m;
}else if(x/m<m){ 16="" 8="" m){
l = m + 1;
}
}
return r;
}

2.2 二分查找模板 II

分查找的高级模板。它用于查找需要访问数组中当前索引及其直接右邻居索引的元素或条件。

int binarySearch(int[] nums, int target){
if(nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length;
while(left < right){
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if(nums[mid] == target){ return mid; }
else if(nums[mid] < target) { left = mid + 1; }
else { right = mid; }
}
// Post-processing:
// End Condition: left == right
if(left != nums.length && nums[left] == target) return left;
return -1;
}

关键属性

  • 一种实现二分查找的高级方法。
  • 查找条件需要访问元素的直接右邻居。
  • 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
  • 保证查找空间在每一步中至少有 2 个元素。
  • 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。

2.3 二分查找模板 III

模板 3 是二分查找的另一种独特形式。它用于搜索需要访问当前索引及其在数组中的直接左右邻居索引的元素或条件。

int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
while (left + 1 < right){
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid;
} else {
right = mid;
}
}
// Post-processing:
// End Condition: left + 1 == right
if(nums[left] == target) return left;
if(nums[right] == target) return right;
return -1;
}

点击下方,第一时间了解华为云新鲜技术~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

以上内容来源于网络,由“WiFi之家网”整理收藏!

原创文章,作者:电脑教程,如若转载,请注明出处:https://www.224m.com/197056.html

(0)
电脑教程电脑教程
gps网络时间同步时钟简介(gps时间同步时区)
上一篇 2022年12月26日 11:35
风扇转转停停开不了机怎么办(开不了机 风扇转转停停)
下一篇 2022年12月26日 11:43

相关推荐

  • 光钎猫连接无线路由器操作方法

    【导读】光钎猫怎么连接无线路由器图图文教程,详细信息请阅读下文!
    使用光钎接入上网时,光猫怎么连接无线路由器设置上网呢?其实光钎接入上网时,与电话线、网线入户上网时,路由"

    路由器设置 2021年1月29日
    9.9K
  • 腾达路由器设置安装入口(腾达路由器怎么安装和设置)

    腾达路由器设置安装入口(腾达路由器怎么安装和设置) 腾达路由器是一款常用的网络接入设备,它可以帮助我们快速接入互联网并进行网络设置。下面介绍一下腾达路由器的安装和设置方法。 安装步…

    2023年11月6日
    424
  • 192168.0.1修改密码(192.168.0.1手机登陆360路由器)

    192.168.0.1是360路由器、腾达路由器使用的登录地址,很多用户知道什么用手机登陆192.168.0.1,今天路由网就给小白用户们带来这篇教程:如何使用手机登录路由器192…

    2021年1月4日
    636.5K
  • 新买的路由器设置连上宽带步骤

    【导读】新买的路由器怎么设置才能连上宽带?图文教程,详细信息请阅读下文!网友提问:新买的路由器怎么设置才能连上宽带?新买了一个无线路由器,请问要怎么设置,才能连上宽带上网?优"

    2021年2月21日
    57.4K
  • 路由器设置二级端口(路由器端口怎么设置)

    路由器设置二级端口(路由器端口怎么设置) 路由器是一个重要的网络设备,它可以将网络流量从一个网络转发到另一个网络。但是,对于一些大型网络来说,一个路由器的端口可能不足以满足需求。在…

    网络 2023年12月3日
    9.6K
  • 华为路由器 设置加密算法(华为路由器入口)

    华为路由器 设置加密算法(华为路由器入口) 华为路由器是一款功能强大且易于使用的网络设备,它可以帮助用户快速搭建自己的家庭或企业网络。当您第一次使用华为路由器时,您需要设置一些基本…

    网络 2024年9月7日
    3.8K
  • 自己家的wifi密码用手机怎么改?

    昨天鸿哥写了一篇文章,介绍了用电脑修改自己家wifi密码的方法。但是,部分用户反馈说,家里面没有电脑,问可不可以用手机来修改wifi密码。这个问题的答案是肯定的,当你家里没有电脑的时候,是可以用手机来修改wifi密码的,而且鸿哥个人觉得,手机操作起来比电脑更加的方便,详细的操作步骤如下:1、首先,请

    2021年5月23日
    9.3K
  • 手机怎么显示wifi密码

    连接过的wifi,大家可能不会刻意去记密码。有时要分享密码给朋友时,就想不起来了。这时可怎么办呢?今天我就教大家一招,轻松查看安卓手机保存的WiFi密码。 1.找到你手机上的【设置】按钮并打开 2.在【设置】中找到【WLAN】 3.在【WLAN】中找到连接的wifi进行分享,荣

    2021年10月17日
    107.3K
  • D-Link无线路由器如何设置LAN口IP地址?(如何在D-Link无线路由器中设置局域网端口的IP地址?)

    本文介绍了D-Link无线路由器设置LAN口IP地址的方法。在我们多路由器组网,或者遇到IP地址冲突时,都是需要设置LAN口IP地址的。然而很多用户在设置D-Link无线路由器LAN口IP地址时,遇到不知道如何设置的情况,在这里为了更好的帮助大家,下面就来为大家演示D-Link无线路

    2022年2月17日
    21.1K
  • 普通路由器信号差怎么设置(路由器信号差怎么设置信号强)

    普通路由器信号差怎么设置 路由器信号差是很多用户面临的问题,特别是在信号覆盖范围较大的情况下,信号差不仅会影响网络速度,还可能导致断网等问题。那么,普通路由器信号差怎么设置呢?下面…

    网络 2024年8月30日
    2.2K