亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言詳細(xì)講解二分查找用法

 更新時(shí)間:2022年04月18日 17:14:47   作者:清風(fēng)自在 流水潺潺  
二分查找法,又叫做折半查找法,它是一種效率較高的查找方法。但是,折半查找要求線(xiàn)性表必須采用順序存儲(chǔ)結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列

【力扣題號(hào)】704.二分查找 力扣題目鏈接

示例 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     

提示:

  • 你可以假設(shè) nums中的所有元素是不重復(fù)的。
  • n將在[1, 10000]之間。
  • nums的每個(gè)元素都將在[-9999, 9999]之間。

注意讀題,數(shù)組為有序數(shù)組,且數(shù)組中無(wú)重復(fù)元素,因?yàn)橐坏┯兄貜?fù)元素,使用二分查找法返回的元素下標(biāo)可能不是唯一的。

在二分查找的過(guò)程中,保持不變量,就是在 while 尋找中每一次邊界的處理都要堅(jiān)持根據(jù)區(qū)間的定義來(lái)操作,這就是循環(huán)不變量規(guī)則。

寫(xiě)二分法,區(qū)間的定義一般為兩種,左閉右閉即 [left, right],或者左閉右開(kāi)即 [left, right)。

  • 二分法第一種寫(xiě)法

第一種寫(xiě)法,我們定義 target 是在一個(gè)在左閉右閉的區(qū)間里,也就是[left, right] 。因?yàn)槎x target 在 [left, right] 區(qū)間,所以有如下兩點(diǎn):

while (left <= right) 要使用 <= ,因?yàn)閘eft == right是有意義的,所以使用 <=

if (nums[middle] > target) ,right 要賦值為 middle - 1,因?yàn)楫?dāng)前這個(gè) nums[middle] 一定不是 target ,那么接下來(lái)要查找的左區(qū)間結(jié)束下標(biāo)位置就是 middle - 1

// 版本一
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; // 定義target在左閉右閉的區(qū)間里,[left, right]
        while (left <= right) { // 當(dāng)left==right,區(qū)間[left, right]依然有效,所以用 <=
            int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
            if (nums[middle] > target) {
                right = middle - 1; // target 在左區(qū)間,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右區(qū)間,所以[middle + 1, right]
            } else { // nums[middle] == target
                return middle; // 數(shù)組中找到目標(biāo)值,直接返回下標(biāo)
            }
        }
        // 未找到目標(biāo)值
        return -1;
    }
};
  • 二分法第二種寫(xiě)法

如果說(shuō)定義 target 是在一個(gè)在左閉右開(kāi)的區(qū)間里,也就是[left, right) ,那么二分法的邊界處理方式則截然不同。

有如下兩點(diǎn):

while (left < right),這里使用 < ,因?yàn)?left == right 在區(qū)間 [left, right) 是沒(méi)有意義的

if (nums[middle] > target) ,right 更新為 middle,因?yàn)楫?dāng)前 nums[middle] 不等于 target,去左區(qū)間繼續(xù)尋找,而尋找區(qū)間是左閉右開(kāi)區(qū)間,所以 right 更新為 middle,即:下一個(gè)查詢(xún)區(qū)間不會(huì)去比較 nums[middle]

// 版本二
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); // 定義target在左閉右開(kāi)的區(qū)間里,即:[left, right)
        while (left < right) { // 因?yàn)閘eft == right的時(shí)候,在[left, right)是無(wú)效的空間,所以使用 <
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > target) {
                right = middle; // target 在左區(qū)間,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右區(qū)間,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle; // 數(shù)組中找到目標(biāo)值,直接返回下標(biāo)
            }
        }
        // 未找到目標(biāo)值
        return -1;
    }
};

通過(guò)以上兩種方法,要注意它們不同的地方:

① right 的初始值不一樣

② 左右區(qū)間的更新值的差別

參考:《代碼隨想錄》

到此這篇關(guān)于C語(yǔ)言詳細(xì)講解二分查找用法的文章就介紹到這了,更多相關(guān)C語(yǔ)言 二分查找內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中const用于函數(shù)重載的示例代碼

    C++中const用于函數(shù)重載的示例代碼

    這篇文章主要介紹了C++中const用于函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • 用C語(yǔ)言實(shí)現(xiàn)從文本文件中讀取數(shù)據(jù)后進(jìn)行排序的功能

    用C語(yǔ)言實(shí)現(xiàn)從文本文件中讀取數(shù)據(jù)后進(jìn)行排序的功能

    這是一個(gè)十分可靠的程序,這個(gè)程序的查錯(cuò)能力非常強(qiáng)悍。程序包含了文件操作,歸并排序和字符串輸入等多種技術(shù)。對(duì)大家學(xué)習(xí)C語(yǔ)言很有幫助,有需要的一起來(lái)看看。
    2016-08-08
  • C語(yǔ)言中的狀態(tài)機(jī)設(shè)計(jì)深入講解

    C語(yǔ)言中的狀態(tài)機(jī)設(shè)計(jì)深入講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言狀態(tài)機(jī)設(shè)計(jì)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解C++編程中斷言static_assert的使用

    詳解C++編程中斷言static_assert的使用

    這篇文章主要介紹了C++編程中斷言static_assert的使用,斷言在debug時(shí)非常有用,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++中的pair使用詳解

    C++中的pair使用詳解

    pair是定義在<utility>中的生成特定類(lèi)型的模板,它的作用是把一組數(shù)據(jù)合并為一體,實(shí)際上是一個(gè)擁有兩個(gè)成員變量的struct,這篇文章主要介紹了c++的pair使用,需要的朋友可以參考下
    2022-09-09
  • vsCode配置import@路徑提示的實(shí)現(xiàn)步驟

    vsCode配置import@路徑提示的實(shí)現(xiàn)步驟

    在導(dǎo)入文件設(shè)置路徑的時(shí)候方便了很多,本文主要介紹了vsCode配置import@路徑提示的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 如何用C語(yǔ)言畫(huà)一個(gè)“圣誕樹(shù)”

    如何用C語(yǔ)言畫(huà)一個(gè)“圣誕樹(shù)”

    這篇文章主要介紹了如何用C語(yǔ)言畫(huà)一個(gè)“圣誕樹(shù)”,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 詳解在VScode中添加代碼塊(含C++指令生成代碼)

    詳解在VScode中添加代碼塊(含C++指令生成代碼)

    這篇文章主要介紹了詳解在VScode中添加代碼塊(含C++指令生成代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 超詳細(xì)VScode調(diào)試教程tasks.json和launch.json的設(shè)置

    超詳細(xì)VScode調(diào)試教程tasks.json和launch.json的設(shè)置

    vscode是一個(gè)輕量級(jí)的文本編輯器,但是它的擴(kuò)展插件可以讓他拓展成功能齊全的IDE,這其中就靠的是tasks.json和launch.json的配置,下面這篇文章主要給大家介紹了關(guān)于超詳細(xì)VScode調(diào)試教程tasks.json和launch.json設(shè)置的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • C++靜態(tài)成員函數(shù)和this指針詳解

    C++靜態(tài)成員函數(shù)和this指針詳解

    這篇文章主要為大家介紹了C++靜態(tài)成員函數(shù)和this指針,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12

最新評(píng)論