每天一題LeetCode【第24天】

T33. Search in Rotated Sorted Array【Medium

題目

假設(shè)有一個升序的數(shù)組以某個未知的支點旋轉(zhuǎn)。

(例如,0 1 2 3 4 5 6 7 可以變成 4 5 6 7 0 1 2

假設(shè)這個數(shù)組中沒有重復的元素,給你一個 target(目標數(shù)),如果在這個數(shù)組中找到則返回它的 index,如果找不到就返回 -1

思路

首先,一般的有序的數(shù)組,查找一個數(shù)字一般都是用二分法,因為這樣比較有效率。

按題中說法旋轉(zhuǎn)數(shù)組后,分成的兩半仍然是排好序的數(shù)組。

例如,4 5 6 7 0 1 2,左邊的 4 5 6 7,以及右邊的 0 1 2 都是排好序的,可以先確定 target 在哪邊,然后繼續(xù)二分查找。不過這個代碼是從中間二分,分到的一半可能還是有兩段排序的代碼,需要繼續(xù)分,就是很神奇的代碼。

具體看代碼以及注釋~還是這句話,最好自己拿個例子試試,瞬間清晰!

信我 (? ??_??)? !

代碼

代碼取自 Top Solution,稍作注釋

public int search(int[] nums, int target) {
        //定位數(shù)組頭和尾
        int start = 0;
        int end = nums.length - 1;
        //start > end時表示里面不包含了,跳出循環(huán)
        while (start <= end){
            int mid = (start + end) / 2;
            //找到匹配值,返回index
            if (nums[mid] == target)
                return mid;
            //通過nums[start] <= nums[mid]表明start~mid這段是正確升序的
            if (nums[start] <= nums[mid]){
            //這就是二分法的做法,判斷點在哪里,然后通過把start或者end賦予新的mid左右的值,表示選擇前一段或者后一段
                 if (target < nums[mid] && target >= nums[start]) 
                    end = mid - 1;
                 else
                    start = mid + 1;
            } 
            //通過nums[mid] <= nums[end]表明mid ~ end這段是正確升序的
            if (nums[mid] <= nums[end]){
             //這就是二分法的做法,判斷點在哪里,然后通過把start或者end賦予新的mid左右的值,表示選擇前一段或者后一段
                if (target > nums[mid] && target <= nums[end])
                    start = mid + 1;
                 else
                    end = mid - 1;
            }
        }
        //不存在的,返回-1
        return -1;
    }

補充

注意啦~這里是代碼里的東西要補充說一下!一開始不明白這代碼為什么要這么多if。

這里是有對應關(guān)系的,先判斷在 start~mid是升序的才能用 target < nums[mid] && target >= nums[start] ,來判斷 target 在不在這一段,然后若不是才說是在 mid ~ end的。(希望只有我一個人最開始第一眼沒有看出來 ╮(??? ????)╭...)

      if (nums[start] <= nums[mid]){
          if (target < nums[mid] && target >= nums[start]) 
               end = mid - 1;
          else
               start = mid + 1
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,927評論 0 33
  • 1. Two Sum 用hash可以得到O(n)時間的解法,用python中的enumerate函數(shù),可以獲得元素...
    Morphiaaa閱讀 543評論 0 0
  • 題目要求是:給定一個數(shù)組,數(shù)組里面都是按升序拍好的數(shù)字,并且無重復數(shù)字;另外給一個比較的數(shù)字target,查找這個...
    其中一個cc閱讀 187評論 0 0
  • T34. Search for a Range【Medium】 題目 給定以升序排序的整數(shù)數(shù)組,找到給定目標值(t...
    草稿紙反面閱讀 519評論 0 1
  • 早上好!#幸福實修#~每天進步1%#幸福實修12班-09-唐潔--富陽# 20171003(8/60) 【幸福三朵...
    你謝謝閱讀 189評論 0 0

友情鏈接更多精彩內(nèi)容