1. 程式人生 > >leetcode33題解_Search in Rotated Sorted Array

leetcode33題解_Search in Rotated Sorted Array

           題意:要在一個排好序的但是旋轉過的序列中找給定的數字。
    (通常的題目是,比如:1,2,3,4,5,6,7.找這組序列中是否有7這個數,但是這個
序列在這個題目中是旋轉過的,但是按哪個位置旋轉不知道,比如旋轉後是:4,5,6,7,1,2,3.
要在這個序列中找7,題目就要求我們寫演算法來找是否有這個數字)
      我的思路:
      直接遍歷一遍,O(n)複雜度-_-。
      其他方法:
      比如有如下的旋轉後的序列:
      [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

     找7

     將序列變成:

      [-F, -F, -F, -F, -F, -F, -F, -F, -F, -F, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

     如果是找16,序列變成:

     [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, +F, +F,+F, +F,+F, +F,+F, +F,+F, +F]。

     抓住trick : 小的在後面,大的在前面,根據特點將某數字變為負無窮或者正無窮,然後再用二分法。
     將rotate後的排列分為前後兩部分,前半部分是較大的數集,後半部分是較小的數集
     例如上面的排列中,
     前半部分:12, 13, 14, 15, 16, 17, 18, 19, 20, 21
     後半部分:2, 3, 4, 5, 6, 7, 8, 9, 10, 11
     因為旋轉了,所以nums[0]頭部位置很重要
     幾種情況 num[ mid ] & target
    1. > nums[0] && target > nums[0] : 表明在同一部分中
    2. < nums[0] && target > nums[0] : +F  target > nums[0]說明target在前半部分,mid < nums[0]說明
    mid是後半部分的數,不考慮,因此,當前位置數置為+F
    3. > nums[0] && target < nums[0] : -F  target < nums[0]說明target在後面,mid > nums[0]說明
   從0到mid位都是大於taget的數字,當前位置數置為-F

   4. < nums[0] && target < nums[0] : 表明在同一部分中

   程式碼:略