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

【劍指Offer】二分法例題

這篇具有很好參考價(jià)值的文章主要介紹了【劍指Offer】二分法例題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

鏈表是數(shù)據(jù)結(jié)構(gòu)中重要的一個(gè)章節(jié),他的重要性也不言而喻,在未來(lái)不管是筆試還是面試都會(huì)遇到這類的題目,所以接下來(lái)我就會(huì)把一些鏈表的常考的題目全部整理出來(lái)供大家學(xué)習(xí)指正。


二、刷題

<1>尋找峰值

題目鏈接

描述:

給定一個(gè)長(zhǎng)度為n的數(shù)組nums,請(qǐng)你找到峰值并返回其索引。數(shù)組可能包含多個(gè)峰值,在這種情況下,返回任何一個(gè)所在位置即可。
1.峰值元素是指其值嚴(yán)格大于左右相鄰值的元素。嚴(yán)格大于即不能有等于
2.假設(shè) nums[-1] = nums[n] = ?∞
3.對(duì)于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的時(shí)間復(fù)雜度實(shí)現(xiàn)此問(wèn)題嗎?

數(shù)據(jù)范圍:

1≤nums.length≤2×10^5
?2 ^31<=nums[i]<=2 ^31?1

如輸入[2,4,1,2,7,8,4]時(shí),會(huì)形成兩個(gè)山峰,一個(gè)是索引為1,峰值為4的山峰,另一個(gè)是索引為5,峰值為8的山峰,如下圖所示:
【劍指Offer】二分法例題

示例1

輸入:[2,4,1,2,7,8,4]
返回值:1
說(shuō)明:4和8都是峰值元素,返回4的索引1或者8的索引5都可以

示例2

輸入:[1,2,3,1]
返回值:2
說(shuō)明:3 是峰值元素,返回其索引 2

思路分析:
這里用到了二分查找的性質(zhì),因?yàn)閿?shù)組兩邊都是無(wú)窮小,所以我們只要往高處找就一定能找到波峰。那么我們就可以找一個(gè)元素,把數(shù)組分成兩個(gè)區(qū)間,每次就走高的一邊,最后就能鎖定出一個(gè)波峰。
【劍指Offer】二分法例題

int findPeakElement(int* nums, int numsLen ) {
    // write code here
    int left = 0, right = numsLen - 1;
    while(left < right)
    {
        int mid = (left + right) / 2;
        //右邊是往下,不一定有坡峰
        if(nums[mid] > nums[mid + 1])
        {
            right = mid;
        }  
        //右邊是往上,一定能找到波峰
        else
        {
            left = mid + 1;
        }
    }
    return left;
}

<2>二維數(shù)組中的查找

題目鏈接
描述:

在一個(gè)二維數(shù)組array中(每個(gè)一維數(shù)組的長(zhǎng)度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
給定 target = 7,返回 true。
給定 target = 3,返回 false。

數(shù)據(jù)范圍:矩陣的長(zhǎng)寬滿足 0≤n,m≤500,矩陣中的值滿足0≤val≤10^9
進(jìn)階:空間復(fù)雜度 O(1)O(1) ,時(shí)間復(fù)雜度 O(n+m)O(n+m)

示例1

輸入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
說(shuō)明:存在7,返回true

示例2:

輸入:1,[[2]]
返回值:false

示例3

輸入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
說(shuō)明:不存在3,返回false

① 線性搜索

最簡(jiǎn)單的方法就是暴力遍歷,沒(méi)有用到二維數(shù)組的遞增性質(zhì)。
通過(guò)規(guī)律發(fā)現(xiàn)左下角所在元素的所在行最小,所在列最大,那么如果target小于所在元素,就讓行--,否則就讓列++。
【劍指Offer】二分法例題

bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
    // write code here
    int row = arrayRowLen - 1, col = 0;
    while(row <= arrayRowLen - 1 && row >= 0 && col <= *arrayColLen - 1 && col >= 0)
    {
        if(array[row][col] == target)
        {
            return true;
        }
        else
        {
            if(array[row][col] < target)
            {
                col++;
            }
            else
            {
                row--;
            }
        }
    }
    return false;
}

② 逐行二分

因?yàn)槊恳恍卸际怯行蜻f增的,所以每一行都能用二分
【劍指Offer】二分法例題

bool binary_search(int* arr, int k, int target)
{
    int left = 0, right = k - 1;
    while (left <= right)
    {
        int mid = (right + left) / 2;
        if (arr[mid] == target)
        {
            return true;
        }
        else if (arr[mid] > target)
        {
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    return false;
}



bool Find(int target, int** array, int arrayRowLen, int* arrayColLen) {
    // write code here
    for (int i = 0; i < arrayRowLen; i++)
    {
        if (binary_search(array[i], *arrayColLen, target))
        {
            return true;
        }
    }
   /*while (arrayRowLen--)
    {
        if (binary_search(*array, *arrayColLen, target))
        {
            return true;
        }
        array++;
    }*/
    return false;
}

<3>旋轉(zhuǎn)數(shù)組的最小數(shù)字

題目鏈接

描述:

有一個(gè)長(zhǎng)度為 n 的非降序數(shù)組,比如[1,2,3,4,5],將它進(jìn)行旋轉(zhuǎn),即把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,變成一個(gè)旋轉(zhuǎn)數(shù)組,比如變成了[3,4,5,1,2],或者[4,5,1,2,3]這樣的。請(qǐng)問(wèn),給定這樣一個(gè)旋轉(zhuǎn)數(shù)組,求數(shù)組中的最小值。

數(shù)據(jù)范圍:1≤n≤10000,數(shù)組中任意元素的值:0≤val≤10000
要求:空間復(fù)雜度:O(1)O(1) ,時(shí)間復(fù)雜度:O(logn)O(logn)

示例1:

輸入:[3,4,5,1,2]
返回值:1

示例2:

輸入:[3,100,200,3]
返回值:3

思路分析:
這道題其實(shí)是二分法的變形,旋轉(zhuǎn)點(diǎn)左邊的元素都單調(diào)遞增且都大于旋轉(zhuǎn)點(diǎn)右邊單調(diào)遞增的元素。
我們的目的是找到旋轉(zhuǎn)點(diǎn)也就是最小的元素,我們可以定義左left、右right指針讓他們相遇在旋轉(zhuǎn)點(diǎn):
當(dāng)arr[mid] > arr[right]時(shí)
說(shuō)明mid一定在左遞增區(qū)間,為了使left移動(dòng)到旋轉(zhuǎn)點(diǎn)就需要縮小區(qū)間,left = mid + 1
當(dāng)arr[mid] < arr[right]時(shí)
說(shuō)明mid一定在右遞增區(qū)間,為了使right移動(dòng)到旋轉(zhuǎn)點(diǎn)就需要縮小區(qū)間,right = mid
但是也有相同元素的情況,例如:{1,0,1,1,1}
這樣就無(wú)法判斷mid在哪個(gè)區(qū)間了。
那么就讓right--,這里不能讓left++,因?yàn)槲覀兪歉钣疫叺脑乇容^,旋轉(zhuǎn)點(diǎn)一定在mid左邊。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-411818.html

int minNumberInRotateArray(int* arr, int sz ) {
    // write code here
    if(sz == 0)
    {
        return 0;
    }
    int left = 0, right = sz - 1;
    while(left < right)
    {
        int mid = (left + right) / 2;
        if(arr[mid] > arr[right])
        {
            left = mid + 1;
        }
        else if(arr[mid] < arr[right])
        {
            right = mid;
        }
        else
        {
            right--;
        }
    }
    return arr[left];
}

到了這里,關(guān)于【劍指Offer】二分法例題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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)文章

  • 初探二分法

    初探二分法

    智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(一) 智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(二) 題目:給定一個(gè) n 個(gè)元素有序的(升序)整型數(shù)組 nums 和一個(gè)目標(biāo)值 target ,寫(xiě)一個(gè)函數(shù)搜索 nums 中的 target,如果目標(biāo)值存在返回下標(biāo),否則返回 -1。 提示: 你可以

    2024年01月25日
    瀏覽(23)
  • 【算法】—二分法詳解

    【算法】—二分法詳解

    ①定義: 二分查找算法也稱折半搜索算法,對(duì)數(shù)搜索算法,是一種在 有序數(shù)組 中查找某一特定元素的搜索算法。搜索過(guò)程從數(shù)組的中間元素開(kāi)始,如果中間元素正好是要查找的元素,則搜索過(guò)程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素

    2024年02月09日
    瀏覽(25)
  • 【二分查找】一文帶你掌握二分法 (附萬(wàn)能模板)

    【二分查找】一文帶你掌握二分法 (附萬(wàn)能模板)

    一、簡(jiǎn)介 哪怕沒(méi)有學(xué)過(guò)編程的同學(xué),也許不知道二分法這個(gè)名字,但也一定接觸過(guò)它的核心思想。不了解的同學(xué)也沒(méi)關(guān)系,我用一句話就能概括出它的精髓: 將一個(gè)區(qū)間一分為二,每次都舍棄其中的一部分。 二分法能夠極大地降低我們?cè)诮鉀Q問(wèn)題時(shí)的時(shí)間復(fù)雜度。假如你要

    2024年01月19日
    瀏覽(23)
  • 牛頓法、割線法、二分法

    牛頓法、割線法、二分法

    牛頓法求解非線性方程組 割線法求解非線性方程組 二分法求解根號(hào)3 ?另外,今天上機(jī)課寫(xiě)程序時(shí),發(fā)現(xiàn)不同的起始點(diǎn)可以收斂到不同的零點(diǎn)。也許這是一個(gè)新的值得研究的地方。 看來(lái),計(jì)算數(shù)學(xué)也是這樣,光聽(tīng)理論無(wú)法實(shí)現(xiàn)大的突破,也沒(méi)法產(chǎn)生好的想法,必須在實(shí)踐應(yīng)用

    2024年02月05日
    瀏覽(25)
  • 非線性方程二分法

    優(yōu)點(diǎn):算法直觀、簡(jiǎn)單、總能保證收斂;局限:收斂速度慢、一般不單獨(dú)用它求根,僅為了獲取根的粗略近似 設(shè) f ( x ) f(x) f ( x ) 在 [ a , b ] [a,b] [ a , b ] 上連續(xù)、嚴(yán)格單調(diào)、滿足條件 f ( a ) f ( b ) 0 f(a)f(b)0 f ( a ) f ( b ) 0 則在區(qū)間 [ a , b ] [a,b] [ a , b ] 內(nèi)必有一根 x ? x^* x ? 。通

    2024年02月04日
    瀏覽(28)
  • 1241:二分法求函數(shù)的零點(diǎn)

    【題目描述】 有函數(shù):f(x)=x5?15x4+85x3?225x2+274x?121 已知f(1.5)0,f(2.4)0 且方程f(x)=0在區(qū)間[1.5,2.41.5,2.4] 有且只有一個(gè)根,請(qǐng)用二分法求出該根。 【輸入】 (無(wú)) 【輸出】 該方程在區(qū)間[1.5,2.41.5,2.4]中的根。要求四舍五入到小數(shù)點(diǎn)后66位。 【輸入樣例】 【輸出樣例】 【AC代碼】

    2024年01月25日
    瀏覽(21)
  • Leetcode刷題筆記——二分法

    Leetcode刷題筆記——二分法

    二分法是搜索算法中極其典型的方法,其要求輸入序列有序并可隨機(jī)訪問(wèn)。算法思想為 輸入:有序數(shù)組nums,目的數(shù)值target 要求輸出:如果target存在在數(shù)組中,則輸出其index,否則輸出-1 將原數(shù)組通過(guò)[left,right]兩個(gè)索引劃分范圍,初值left=0,right=數(shù)組的最后一個(gè)元素 當(dāng)left = r

    2024年02月10日
    瀏覽(21)
  • 06-C++ 基本算法 - 二分法

    06-C++ 基本算法 - 二分法

    在這個(gè)筆記中,我們將介紹二分法這種基本的算法思想,以及它在 C++ 中的應(yīng)用。我們將從一個(gè)小游戲猜數(shù)字開(kāi)始,通過(guò)這個(gè)案例來(lái)引出二分法的概念。然后我們將詳細(xì)講解什么是二分法以及它的套路和應(yīng)用。最后,我們還會(huì)介紹 C++ STL 中的二分查找函數(shù)。讓我們一起來(lái)探索

    2024年02月16日
    瀏覽(16)
  • 算法:二分法---尋找H指數(shù)

    算法:二分法---尋找H指數(shù)

    1、題目: 給你一個(gè)整數(shù)數(shù)組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數(shù)。計(jì)算并返回該研究者的 h 指數(shù) 。 根據(jù)維基百科上 h 指數(shù)的定義: h 代表“高引用次數(shù)” ,一名科研人員的 h 指數(shù) 是指他(她)至少發(fā)表了 h 篇論文,并且每篇論文 至少 被引用

    2024年02月08日
    瀏覽(21)
  • 33. 搜索旋轉(zhuǎn)排序數(shù)組(二分法)

    題目要求必須設(shè)計(jì)一個(gè)時(shí)間復(fù)雜度為? O(log n) ?的算法解決此問(wèn)題,所以我們可以采用二分法。 Step1. 先把 nums[0] 作為目標(biāo)值,通過(guò)二分法找到旋轉(zhuǎn)點(diǎn)索引; Step2. 如果旋轉(zhuǎn)點(diǎn)索引為0,則數(shù)組本身就是升序的,否則思想上可以將數(shù)組一分為二,看做兩個(gè)升序數(shù)組。 Step3. 判斷

    2024年02月05日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包