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

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

這篇具有很好參考價值的文章主要介紹了「優(yōu)選算法刷題」:在排序數(shù)組中查找元素的第一個和最后個位置。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、題目

給你一個按照非遞減順序排列的整數(shù)數(shù)組?nums,和一個目標值?target。請你找出給定目標值在數(shù)組中的開始位置和結(jié)束位置。

如果數(shù)組中不存在目標值?target,返回?[-1, -1]。

你必須設(shè)計并實現(xiàn)時間復雜度為?O(log n)?的算法解決此問題。

示例 1:

輸入:nums = [5,7,7,8,8,10], target = 8
輸出:[3,4]

示例?2:

輸入:nums = [5,7,7,8,8,10], target = 6
輸出:[-1,-1]

示例 3:

輸入:nums = [], target = 0
輸出:[-1,-1]

二、思路解析

二分查找,它很簡單,但也很容易寫出死循環(huán)。不過,不必過多恐懼,只要多做練習,他就會是最簡單的查找算法!

我們來看這道題,主要分為 2 部分:查找區(qū)間的左端點 和 右端點。

1)查找區(qū)間左端點

「優(yōu)選算法刷題」:在排序數(shù)組中查找元素的第一個和最后個位置,詳解算法題,算法,數(shù)據(jù)結(jié)構(gòu),leetcode,java,開發(fā)語言,職場和發(fā)展,python

左邊界劃分的兩個區(qū)間的特點:

? 左邊區(qū)間 [left, resLeft - 1] 都是?于 x 的;
? 右邊區(qū)間(包括左邊界) [resLeft, right] 都是?于等于 x 的;

因此,關(guān)于 mid 的落點,我們可以分為下?兩種情況:

? 當我們的 mid 落在 [left, resLeft - 1] 區(qū)間的時候,也就是 arr[mid] <target 。說明 [left, mid] 都是可以舍去的,此時更新 left 到 mid + 1 的位置,繼續(xù)在 [mid + 1, right] 上尋找左邊界;


? 當 mid 落在 [resLeft, right] 的區(qū)間的時候,也就是 arr[mid] >= target 。說明 [mid + 1, right] (因為 mid 可能是最終結(jié)果,不能舍去)是可以舍去的,此時更新 right 到 mid 的位置,繼續(xù)在 [left, mid] 上尋找左邊界;

注意:這?找中間元素需要向下取整,即 mid = left + ( right - left ) / 2 ,而不是?mid = left + ( right - left + 1?) / 2 。

因為后續(xù)移動左右指針的時候:
? 左指針: left = mid + 1 ,是會向后移動的,因此區(qū)間是會縮?的;
? 右指針: right = mid ,可能會原地踏步(?如:如果向上取整的話,如果剩下 1,2 兩個元
素, left == 1 , right == 2 , mid == 2 。更新區(qū)間之后, left,right,mid 的
值沒有改變,就會陷?死循環(huán))。
因此?定要注意,當 right = mid 的時候,要向下取整。

2)查找區(qū)間右端點

我們先? resRight 表?右邊界;

這時可以注意到右邊界的特點:

????????? 左邊區(qū)間 (包括右邊界) [left, resRight] 都是?于等于 x 的;
????????? 右邊區(qū)間 [resRight+ 1, right] 都是?于 x 的;

因此,關(guān)于 mid 的落點,我們可以分為下?兩種情況:

? 當我們的 mid 落在 [left, resRight] 區(qū)間的時候,說明 [left, mid - 1]( mid 不可以舍去,因為有可能是最終結(jié)果) 都是可以舍去的,此時更新 left 到 mid的位置;
? 當?mid 落在 [resRight+ 1, right] 的區(qū)間的時候,說明?[mid, right] 內(nèi)的元素是可以舍去的,此時更新?right 到?mid - 1 的位置;

? 由此,就可以通過?分,來快速尋找右邊界;
注意:這?找中間元素需要向上取整「?mid = left + ( right - left + 1?) / 2」。

因為后續(xù)移動左右指針的時候:
? 左指針: left = mid ,可能會原地踏步(比如:如果向下取整的話,如果剩下?1,2 兩個元
素, left == 1, right == 2,mid == 1 。更新區(qū)間之后, left,right,mid ?的值
沒有改變,就會陷?死循環(huán))。
? 右指針: right = mid - 1 ,是會向前移動的,因此區(qū)間是會縮小的;
因此?定要注意,當? right = mid ?的時候,要向下取整。

三、完整代碼

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int ret[] = new int[2];
        ret[0] = ret[1] = -1;

        // 處理邊界情況
        if(nums.length == 0){
            return ret;
            }

        // 1. ?分左端點    
        int left = 0;
        int right = nums.length - 1;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < target){
                left = mid + 1; 
            }else{
                right = mid;
            }
        }

        // 判斷是否有結(jié)果
        if(nums[left] != target){
            return ret;
        }else{
            ret[0] = left;
        }

        // 2. ?分右端點
        left = 0;
        right = nums.length - 1;
        while(left < right){
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target){
                left = mid;
            }else{
                right = mid - 1;
            }
        }
        ret[1] = right;
        return ret ;
    }
}

以上就是本篇博客的全部內(nèi)容啦,如有不足之處,還請各位指出,期待能和各位一起進步!文章來源地址http://www.zghlxwxcb.cn/news/detail-816051.html

到了這里,關(guān)于「優(yōu)選算法刷題」:在排序數(shù)組中查找元素的第一個和最后個位置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

    2023年04月15日
    瀏覽(28)
  • 34.在排序數(shù)組中查找元素的第一個和最后一個位置

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

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

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

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

    2024年02月06日
    瀏覽(28)
  • 在排序數(shù)組中查找元素的第一個和最后一個位置——力扣34

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

    題目描述 法一 二分查找

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

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

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

    2024年02月03日
    瀏覽(28)
  • LeetCode 34 在排序數(shù)組中查找元素的第一個和最后一個位置

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

    2024年02月02日
    瀏覽(25)
  • 【LeetCode】每日一題&&兩數(shù)之和&&尋找正序數(shù)組的中位數(shù)&&找出字符串中第一個匹配項的下標&&在排序數(shù)組中查找元素的第一個和最后一個位置

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

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

    2024年02月08日
    瀏覽(36)
  • 「優(yōu)選算法刷題」:長度最小的子數(shù)組

    給定一個含有? n ? 個正整數(shù)的數(shù)組和一個正整數(shù)? target ?。 找出該數(shù)組中滿足其總和大于等于 ? target ? 的長度最小的? 連續(xù)子數(shù)組 ? [numsl, numsl+1, ..., numsr-1, numsr] ?,并返回其長度 。 如果不存在符合條件的子數(shù)組,返回? 0 ?。 示例 1: 示例 2: 示例 3: 這道題也是一道

    2024年01月23日
    瀏覽(29)
  • 老衛(wèi)帶你學---leetcode刷題(215. 數(shù)組中的第K個最大元素)

    給定整數(shù)數(shù)組 nums 和整數(shù) k,請返回數(shù)組中第 k 個最大的元素。 請注意,你需要找的是數(shù)組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。 你必須設(shè)計并實現(xiàn)時間復雜度為 O(n) 的算法解決此問題。 堆排序 對每個元素入堆,然后pop出來k-1個 這里需要注意,默認堆為最

    2024年02月07日
    瀏覽(26)
  • 【LeetCode刷題(數(shù)組and排序)】:存在重復元素

    【LeetCode刷題(數(shù)組and排序)】:存在重復元素

    給你一個整數(shù)數(shù)組 nums 。如果任一值在數(shù)組中出現(xiàn) 至少兩次 ,返回 true ;如果數(shù)組中每個元素互不相同,返回 false 示例 1: 輸入:nums = [1,2,3,1] 輸出:true 示例 2: 輸入:nums = [1,2,3,4] 輸出:false 示例 3: 輸入:nums = [1,1,1,3,3,4,3,2,4,2] 輸出:true 在對數(shù)字從小到大排序之后,數(shù)

    2024年02月07日
    瀏覽(95)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包