国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

這篇具有很好參考價(jià)值的文章主要介紹了二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++

個(gè)人主頁 : 個(gè)人主頁
個(gè)人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》《C++》《算法》


前言

本篇文章僅是作為小白的我的一些理解,,如果有錯(cuò)誤的地方,希望大佬們指出。


  • 題目鏈接: 34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

一、題目解析

二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++
本題數(shù)組元素不唯一,可能存在多個(gè)target,我們就是要找到target區(qū)間中的左端點(diǎn)與右端點(diǎn)。
二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++
如果沒有target區(qū)間,則返回{-1, -1}

二、解題思路

1. 暴力查找

直接遍歷數(shù)組,如果可以查找到target則返回第一次與最后一次遇到target的下標(biāo),如果不能查找到target則返回{-1, -1}。
時(shí)間復(fù)雜度:O(n)

2. 一次二分查找 + 部分遍歷

優(yōu)先使用二分查找target,如果可以查找到,就從該下標(biāo)開始向左向右遍歷數(shù)組,返回最左邊與最右邊的target。如果不能查找到,返回{-1, -1}
時(shí)間復(fù)雜度:O(logn + n)

對(duì)于{3,3,3,3,3,3,3,3} target = 3,時(shí)間復(fù)雜度會(huì)退化為O(n)

3. 兩次二分查找分別查找左右端點(diǎn)

1.查找區(qū)間左端點(diǎn)

我們對(duì)示例1使用 “ 二段性 ” 可以發(fā)現(xiàn)示例一被target分成了兩部分,小于target部分{5, 7, 7}和大于等于target部分{8, 8, 10}。
二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++
如果中點(diǎn)mid到小于target的部分,區(qū)間[ left, mid ]這一區(qū)間都小于target,不可能是target區(qū)間的左端點(diǎn),那么left = mid + 1;
如果中點(diǎn)mid到大于等于target的部分,區(qū)間[ mid, right ]這一區(qū)間都大于等于target, 其中mid有可能是target區(qū)間的左端點(diǎn),那么right = mid;
二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++


細(xì)節(jié)處理

  • 循環(huán)條件:left < right
    如果循環(huán)條件為left <= right就會(huì)死循環(huán)。
    二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++

如上圖4所示,nums[mid] >= target,right = mid。此時(shí)right依然與left指向同一個(gè)元素。

  • 求mid的操作
    向下取整:mid = left + (right - left)/2 向上取整:mid = left + (right - left + 1)/2;二者主要區(qū)別在與如果區(qū)間[ left, right]中的元素個(gè)數(shù)是偶數(shù)時(shí),向下取整取的是中間兩個(gè)數(shù)中左邊的數(shù),向上取整取的是中間兩個(gè)數(shù)中右邊的數(shù)。
    此時(shí)查找區(qū)間左端點(diǎn),求mid使用向上取整會(huì)導(dǎo)致死循環(huán)。
    二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++

2. 查找區(qū)間右端點(diǎn)

查找區(qū)間右端點(diǎn)思路與查找區(qū)間左端點(diǎn)類似。
我們使用“二段性”發(fā)現(xiàn)示例一被target分成了兩部分,小于等于target部分{5, 7, 7, 8, 8} 和大于target部分{10}。
二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++
如果點(diǎn)mid到小于等于target的部分,區(qū)間[ left, mid ] 這一區(qū)間都小于等于target,其中mid可能就是target區(qū)間的右端點(diǎn),那么left = mid;
如果點(diǎn)mid到大于target的部分,區(qū)間[ mid, right ]這一區(qū)間都大于target,不可能是target區(qū)間的右端點(diǎn),那么right= mid - 1;
二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++


細(xì)節(jié)處理

  • 循環(huán)條件:left < right, 理由與查找左端點(diǎn)使的循環(huán)條件相同,如果循環(huán)條件為left <= right會(huì)死循環(huán)
    二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++
    如上圖4所示,nums[mid] <= target,left = mid, 此時(shí)left依然與right指向同一個(gè)元素。

  • 求mid的操作,這里就要用向上取整的方法 mid = left + (right - left + 1)/2
    此處查找區(qū)間右端點(diǎn),如果使用向下取整會(huì)導(dǎo)致死循環(huán)
    二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++

三、代碼實(shí)現(xiàn)

兩次二分查找分別查找左右端點(diǎn)

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ret({-1, -1});

        int n = nums.size();
        if(n == 0)
            return ret;

        int left = 0, right = n-1;
        // 查找左端點(diǎn)
        while(left < right)
        {
            int mid = left + (right - left)/2;
            if(nums[mid] < target)
                left = mid+1;
            else
                right = mid;
        }
        if(nums[right] == target)
            ret[0] = right;
        
        // 查找右端點(diǎn)
        left = 0, right = n-1;
        while(left < right)
        {
            int mid = left + (right - left + 1)/2;
            if(nums[mid] > target)
                right = mid - 1;
            else
                left = mid;
        }
        if(nums[right] == target)
            ret[1] = right;

        return ret;
    }
};

總結(jié)

以上就是我對(duì)于在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的理解。感謝支持!?。?br>二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置,算法,c++文章來源地址http://www.zghlxwxcb.cn/news/detail-719438.html

到了這里,關(guān)于二分查找:34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • LeetCode 34 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

    在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置 給你一個(gè)按照非遞減順序排列的整數(shù)數(shù)組 nums ,和一個(gè)目標(biāo)值 target 。請(qǐng)你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標(biāo)值 target ,返回 [-1, -1] 。 你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為 O(log n) 的算法解決此

    2024年02月02日
    瀏覽(25)
  • 二分查找實(shí)例1(在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置)

    二分查找實(shí)例1(在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置)

    給你一個(gè)按照非遞減順序排列的整數(shù)數(shù)組? nums ,和一個(gè)目標(biāo)值? target 。請(qǐng)你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標(biāo)值? target ,返回? [-1, -1] 。 你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為? O(log n) ?的算法解決此問題。 示例 1: 示例?2: 示例 3: 提示

    2024年02月09日
    瀏覽(19)
  • 84.在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置(力扣)

    84.在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置(力扣)

    目錄 問題描述 代碼解決以及思想? 知識(shí)點(diǎn)? 初始化左邊界 left 為數(shù)組的起始位置(0),右邊界 right 為數(shù)組的結(jié)束位置( nums.size() - 1 )。 進(jìn)入一個(gè)循環(huán),只要左邊界 left 不大于右邊界 right ,就執(zhí)行以下操作: a. 計(jì)算中間位置 middle ,這是為了進(jìn)行二分查找,以避免整數(shù)溢

    2024年02月06日
    瀏覽(28)
  • 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置(Java詳解)

    在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置(Java詳解)

    給你一個(gè)按照 非遞減 順序排列的整數(shù)數(shù)組? nums ,和一個(gè)目標(biāo)值? target 。請(qǐng)你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標(biāo)值? target ,返回? [-1, -1] 。 你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為 ? O(log n) ?的算法解決此問題。 示例: 輸入:nums = [5,7,7,8,8

    2024年02月03日
    瀏覽(28)
  • 【算法Hot100系列】在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

    【算法Hot100系列】在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月02日
    瀏覽(28)
  • 「優(yōu)選算法刷題」:在排序數(shù)組中查找元素的第一個(gè)和最后個(gè)位置

    「優(yōu)選算法刷題」:在排序數(shù)組中查找元素的第一個(gè)和最后個(gè)位置

    給你一個(gè)按照非遞減順序排列的整數(shù)數(shù)組? nums ,和一個(gè)目標(biāo)值? target 。請(qǐng)你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標(biāo)值? target ,返回? [-1, -1] 。 你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為? O(log n) ?的算法解決此問題。 示例 1: 示例?2: 示例 3: 二分

    2024年01月22日
    瀏覽(21)
  • 【LeetCode】每日一題&&兩數(shù)之和&&尋找正序數(shù)組的中位數(shù)&&找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo)&&在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

    【LeetCode】每日一題&&兩數(shù)之和&&尋找正序數(shù)組的中位數(shù)&&找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo)&&在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

    ========================================================================= 主頁點(diǎn)擊直達(dá): 個(gè)人主頁 我的小倉庫: 代碼倉庫 C語言偷著笑: C語言專欄 數(shù)據(jù)結(jié)構(gòu)挨打小記: 初階數(shù)據(jù)結(jié)構(gòu)專欄 Linux被操作記: Linux專欄 LeetCode刷題掉發(fā)記: LeetCode刷題 算法: 算法專欄? C++頭疼記: C++專欄 計(jì)算機(jī)

    2024年02月08日
    瀏覽(36)
  • 【leetcode題解C++】34.在排序數(shù)值中查找第一個(gè)和最后一個(gè)位置

    給你一個(gè)按照非遞減順序排列的整數(shù)數(shù)組? nums ,和一個(gè)目標(biāo)值? target 。請(qǐng)你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標(biāo)值? target ,返回? [-1, -1] 。 你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為? O(log n) ?的算法解決此問題。 示例 1: 示例?2: 示例 3: 思路

    2024年01月16日
    瀏覽(23)
  • [二分查找]LeetCode2040:兩個(gè)有序數(shù)組的第 K 小乘積

    [二分查找]LeetCode2040:兩個(gè)有序數(shù)組的第 K 小乘積

    二分查找算法合集 給你兩個(gè) 從小到大排好序 且下標(biāo)從 0 開始的整數(shù)數(shù)組 nums1 和 nums2 以及一個(gè)整數(shù) k ,請(qǐng)你返回第 k (從 1 開始編號(hào))小的 nums1[i] * nums2[j] 的乘積,其中 0 = i nums1.length 且 0 = j nums2.length 。 示例 1: 輸入:nums1 = [2,5], nums2 = [3,4], k = 2 輸出:8 解釋:第 2 小的乘

    2024年02月04日
    瀏覽(29)
  • C++二分查找算法:有序矩陣中的第 k 個(gè)最小數(shù)組和

    C++二分查找算法:有序矩陣中的第 k 個(gè)最小數(shù)組和

    二分查找算法合集 C++二分查找算法:查找和最小的 K 對(duì)數(shù)字 十分接近m恒等于2 給你一個(gè) m * n 的矩陣 mat,以及一個(gè)整數(shù) k ,矩陣中的每一行都以非遞減的順序排列。 你可以從每一行中選出 1 個(gè)元素形成一個(gè)數(shù)組。返回所有可能數(shù)組中的第 k 個(gè) 最小 數(shù)組和。 示例 1: 輸入:

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包