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

33. 搜索旋轉(zhuǎn)排序數(shù)組(二分法)

這篇具有很好參考價(jià)值的文章主要介紹了33. 搜索旋轉(zhuǎn)排序數(shù)組(二分法)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、算法思路

題目要求必須設(shè)計(jì)一個(gè)時(shí)間復(fù)雜度為?O(log n)?的算法解決此問題,所以我們可以采用二分法。

Step1. 先把 nums[0] 作為目標(biāo)值,通過二分法找到旋轉(zhuǎn)點(diǎn)索引;

Step2. 如果旋轉(zhuǎn)點(diǎn)索引為0,則數(shù)組本身就是升序的,否則思想上可以將數(shù)組一分為二,看做兩個(gè)升序數(shù)組。

Step3. 判斷 target 目標(biāo)值在一分為二后的數(shù)組的哪一個(gè)里面,從而確定左右端索引。(特殊情況:如果旋轉(zhuǎn)點(diǎn)索引為0,則左右端索引就是 0 和 nums.length - 1)

Step4. 確認(rèn)了左右端索引之后,通過二分法查找到 target 值所在索引,若不存在則返回 -1。

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

public class Search {

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.search(new int[]{4,5,6,7,0,1,2}, 0));//4
        System.out.println(sol.search(new int[]{4,5,6,7,0,1,2}, 5));//1
        System.out.println(sol.search(new int[]{1,3,5,7,9}, 3));//1
        System.out.println(sol.search(new int[]{1,3}, 3));//1
        System.out.println(sol.search(new int[]{3,1}, 1));//1
        System.out.println(sol.search(new int[]{8,9,2,3,4}, 9));//1
        System.out.println(sol.search(new int[]{4,5,6,7,0,1,2}, 3));//-1
        System.out.println(sol.search(new int[]{1}, 0));//-1
        System.out.println(sol.search(new int[]{1,3}, 0));//-1
    }
}

// 逐一查找法
//class Solution {
//    public int search(int[] nums, int target) {
//        for (int i = 0; i < nums.length; i++) {
//            if(nums[i] == target){
//                return i;
//            }
//        }
//        return -1;
//    }
//}

// 二分查找法
class Solution {
    public int search(int[] nums, int target) {
        if (nums.length == 1){
            return nums[0] == target ? 0: -1;
        }
        // 尋找旋轉(zhuǎn)點(diǎn)的索引
        int l = 1;
        int r = nums.length - 1;
        while(l <= r){
            int mid = l + r >> 1;
            if(nums[mid] > nums[0]) l = ++mid;
            else r = --mid;
        }

        if(l > nums.length - 1){  //旋轉(zhuǎn)點(diǎn)為0時(shí),數(shù)組依舊是升序排列的
            l = 0;
            r = nums.length - 1;
        }else if (target >= nums[0]){
            r = l - 1;
            l = 0;
        }else if(target <= nums[nums.length - 1]){
            r = nums.length - 1;
        }else return -1;  //target小于nums[0]又大于nums[n-1]時(shí)直接返回-1

        //target等于兩邊時(shí)直接返回索引
        if (nums[l] == target) return l;
        if (nums[r] == target) return r;

        // 最后進(jìn)行二分查找
        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] == target) return mid;
            if(nums[mid] < target) l = ++mid;
            else r = --mid;
        }
        if(nums[l] != target) return -1;
        return l;
    }
}

3、完整題目

整數(shù)數(shù)組?nums?按升序排列,數(shù)組中的值?互不相同?。

在傳遞給函數(shù)之前,nums?在預(yù)先未知的某個(gè)下標(biāo)?k0 <= k < nums.length)上進(jìn)行了?旋轉(zhuǎn),使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標(biāo)?從 0 開始?計(jì)數(shù))。例如,?[0,1,2,4,5,6,7]?在下標(biāo)?3?處經(jīng)旋轉(zhuǎn)后可能變?yōu)?[4,5,6,7,0,1,2]?。

給你?旋轉(zhuǎn)后?的數(shù)組?nums?和一個(gè)整數(shù)?target?,如果?nums?中存在這個(gè)目標(biāo)值?target?,則返回它的下標(biāo),否則返回?-1?。

你必須設(shè)計(jì)一個(gè)時(shí)間復(fù)雜度為?O(log n)?的算法解決此問題。

示例 1:

輸入:nums = [4,5,6,7,0,1,2], target = 0
輸出:4

示例?2:

輸入:nums = [4,5,6,7,0,1,2], target = 3
輸出:-1

示例 3:

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

提示:文章來源地址http://www.zghlxwxcb.cn/news/detail-742836.html

  • 1 <= nums.length <= 5000
  • -10^4 <= nums[i] <= 10^4
  • nums?中的每個(gè)值都?獨(dú)一無二
  • 題目數(shù)據(jù)保證?nums?在預(yù)先未知的某個(gè)下標(biāo)上進(jìn)行了旋轉(zhuǎn)
  • -10^4 <= target <= 10^4

到了這里,關(guān)于33. 搜索旋轉(zhuǎn)排序數(shù)組(二分法)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 33.搜索旋轉(zhuǎn)排序數(shù)組

    33.搜索旋轉(zhuǎn)排序數(shù)組

    整數(shù)數(shù)組 nums 按升序排列,數(shù)組中的值 互不相同 。 在傳遞給函數(shù)之前, nums 在預(yù)先未知的某個(gè)下標(biāo) k ( 0 = k nums.length )上進(jìn)行了 旋轉(zhuǎn) ,使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (下標(biāo) 從 0 開始 計(jì)數(shù))。例如, [0,1,2,4,5,6,7] 在下標(biāo) 3 處經(jīng)旋轉(zhuǎn)后可能

    2024年02月01日
    瀏覽(56)
  • leetcode 33.搜索旋轉(zhuǎn)排序數(shù)組

    leetcode 33.搜索旋轉(zhuǎn)排序數(shù)組

    ?? leetcode鏈接:搜索旋轉(zhuǎn)排序數(shù)組 ps: 本題是二分查找的變形,旋轉(zhuǎn)排序數(shù)組之后其實(shí)會(huì) 形成兩個(gè)有序的區(qū)間 。算出平均下標(biāo)先判斷是否與 target 相等,因?yàn)檫@樣可以減少代碼的冗余。如果前者不成立則使用平均下標(biāo)元素 midIndex 與 數(shù)組最后一個(gè)元素判斷大?。ㄒ?yàn)槲覀兛?/p>

    2024年02月13日
    瀏覽(18)
  • LeetCode 33題:搜索旋轉(zhuǎn)排序數(shù)組

    LeetCode 33題:搜索旋轉(zhuǎn)排序數(shù)組

    目錄 題目 思路 代碼 暴力解法 分方向法 二分法 整數(shù)數(shù)組? nums ?按升序排列,數(shù)組中的值? 互不相同 ?。 在傳遞給函數(shù)之前, nums ?在預(yù)先未知的某個(gè)下標(biāo)? k ( 0 = k nums.length )上進(jìn)行了? 旋轉(zhuǎn) ,使數(shù)組變?yōu)? [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (下標(biāo)?

    2024年02月13日
    瀏覽(22)
  • 二分法簡單題

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

    【算法】—二分法詳解

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

    2024年02月09日
    瀏覽(24)
  • 二分法相關(guān)使用

    二分法相關(guān)使用

    在線OJ:704. 二分查找 有序數(shù)組下的二分思路如下: 由于這里是有序數(shù)組, 我們可以可以先得到中點(diǎn)位置, 中點(diǎn)可以把數(shù)組分為左右兩邊; 如果中點(diǎn)位置的值等于目標(biāo)值, 直接返回中點(diǎn)位置; 如果中點(diǎn)位置的值小于目標(biāo)值, 則去數(shù)組中點(diǎn)左側(cè)按同樣的方式查找; 如果中點(diǎn)位置的值大

    2024年02月07日
    瀏覽(17)
  • 初探二分法

    初探二分法

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

    2024年01月25日
    瀏覽(22)
  • 二分法MATLAB代碼

    二分法MATLAB代碼

    本質(zhì)是通過不斷進(jìn)行區(qū)間壓縮來獲取函數(shù)零點(diǎn)。 二分法的終止條件:區(qū)間長度小于等于精度要求 。 流程: 如下圖所示:

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

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

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

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

    牛頓法、割線法、二分法

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

    2024年02月05日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包