圖解Java經(jīng)典算法折半查找的原理與實(shí)現(xiàn)
二分查找
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法,可以在數(shù)據(jù)規(guī)模的對(duì)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 中模擬UDP傳輸?shù)陌l(fā)送端和接收端實(shí)例詳解
這篇文章主要介紹了java 中模擬UDP傳輸?shù)陌l(fā)送端和接收端實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案
這篇文章主要介紹了eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Java使用WatchService監(jiān)控文件內(nèi)容變化的示例
本篇文章主要介紹了Java使用WatchService監(jiān)控文件變化的示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10