leetcode33題解_Search in Rotated Sorted Array
阿新 • • 發佈:2019-02-08
題意:要在一個排好序的但是旋轉過的序列中找給定的數字。
(通常的題目是,比如: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]
將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
(通常的題目是,比如: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] : 表明在同一部分中
程式碼:略