圖解Java經(jīng)典算法折半查找的原理與實(shí)現(xiàn)
二分查找
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法,可以在數(shù)據(jù)規(guī)模的對數(shù)時(shí)間復(fù)雜度內(nèi)完成查找。是一種在有序數(shù)組中查找某一特定元素的搜索算法。
算法思路
以升序數(shù)列為例,比較目標(biāo)元素與數(shù)列中間位置的元素的大小,如果目標(biāo)元素比中間位置的元素大,則繼續(xù)在數(shù)列的后半部分中進(jìn)行二分查找;如果目標(biāo)元素比中間位置的元素小,則在數(shù)列的前半部分進(jìn)行比較;如果相等,則找到了元素的位置。每次比較的數(shù)列長度都會(huì)是之前數(shù)列的一半,直到找到相等元素的位置或者最終沒有找到目標(biāo)元素。
圖解
給定一個(gè)有序的升序排列的數(shù)組 nums=[-1,0,2,5,8,12,18,38,43,46]
然后在該數(shù)組中找到目標(biāo)值 target = 12。
圖解如下:

力扣原題
題目描述:
給定一個(gè) n 個(gè)元素有序的(升序)整型數(shù)組 nums 和一個(gè)目標(biāo)值 target ,寫一個(gè)函數(shù)搜索 nums 中的 target,如果目標(biāo)值存在返回下標(biāo),否則返回 -1。
示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現(xiàn)在 nums 中并且下標(biāo)為 4
示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
解題思路:
根據(jù)題意得出該數(shù)組為有序數(shù)組,這也是使用二分查找的前提條件。
- 定義兩個(gè)指針分別指向數(shù)組的首尾兩個(gè)元素;
- 找到數(shù)組的中間值mid;
- 如果
nums[mid] < target,則 target 位于數(shù)組的后半部分,反之nums[mid] > target在前半部分; - 重復(fù)上一步操作,直到
nums[mid] = target,說明找到target,返回下標(biāo)即可。
Java代碼實(shí)現(xiàn):
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length - 1;
while(left <= right) { // 循環(huán)條件
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 找不到則返回-1
}
}
復(fù)雜度分析:
- 時(shí)間復(fù)雜度:O(logn),其中 n 是數(shù)組的長度。
- 空間復(fù)雜度:O(1)。
到此這篇關(guān)于圖解Java經(jīng)典算法折半查找的原理與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java折半查找內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA集成DeepSeek的詳細(xì)教程(保姆級教程)
DeepSeek作為一款強(qiáng)大的代碼搜索和分析工具,能夠幫助開發(fā)者快速定位代碼、理解項(xiàng)目結(jié)構(gòu)以及優(yōu)化代碼質(zhì)量,本文將詳細(xì)介紹如何在IntelliJ?IDEA中集成DeepSeek,并展示如何利用它來提升開發(fā)效率,感興趣的朋友一起看看吧2025-02-02
將java程序打成jar包在cmd命令行下執(zhí)行的方法
這篇文章主要給大家介紹了關(guān)于將java程序打成jar包在cmd命令行下執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
SpringBoot視圖解析實(shí)現(xiàn)原理深入分析
視圖解析其實(shí)就是SpringBoot某一個(gè)controller的方法執(zhí)行完成之后,它是跳轉(zhuǎn)到那個(gè)頁面。由于我們springboot項(xiàng)目默認(rèn)打包為jar包,是形成壓縮包的形式,而jsp又不支持壓縮,所以我們SpringBoot不知JSP的,需要引入第三方模板引擎才可以處理2022-10-10
攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn)
這篇文章主要介紹了攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Spring Boot security 默認(rèn)攔截靜態(tài)資源的解決方法
這篇文章主要介紹了Spring Boot security 默認(rèn)攔截靜態(tài)資源,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

