分析:根據題意可知,旋轉陣列就是將乙個遞增的陣列分成兩個遞增陣列去看待,乙個在前,乙個在後,後面的陣列是值較小的陣列,前面的陣列是值較大的陣列。
思路一:暴力法,直接遍歷。我們已經知道,不考慮特殊情況,在前面的陣列是值較大的陣列,在後面的陣列是值較小的陣列。那麼我們可以遍歷陣列,對前後兩個數字進行比較,直到出現當前數字比前乙個數字小的情況,那麼當前數字就是在整個陣列中值最小的那乙個。
特殊情況1:整個陣列就是遞增的,也就是說旋轉的時候,把0個數字放在了後面,相當於整個陣列沒有變,那麼我們在遍歷的過程中就不會出現「當前數字小於前乙個數字的情況」,因此我們可以在遍歷結束後直接返回陣列的首個元素。
特殊情況2:整個陣列的元素都相同,那麼我們也可以按照上面那種情況對待,在遍歷結束後直接返回陣列的首個元素。
**:
class
solution
}return numbers[min];}
}
複雜度分析:時間複雜度:o(n),因為在最差的情況下會對整個陣列遍歷一遍。
空間複雜度:o(1),沒有使用額外的空間
思路二:二分查詢當然,上面的方法太簡單了,我們在做題的過程中不要被表象所迷惑,這道題實際上考察的是二分查詢法。
二分查詢的精髓是:每次判斷都能將一部分沒用的資料排除掉。在這個題中,我們把整個陣列當成了兩個遞增陣列來看待,所以是可以在每次比較的時候排除一部分資料的。
因此我們使用二分查詢的方法來分析一下:
首先定義左邊界left=0
, 有邊界right=numbers.length-1
,在每次迴圈開始前都讓mid=left+(right-left)/2
我們每次都讓中間值和有邊界的值進行比較(左邊界同理)
**:
class
solution
else
if(numbers[mid]
> numbers[right]
)else
if(numbers[mid]
== numbers[right])}
return numbers[left];}
}
複雜度分析:時間複雜度:最差情況是如果元素全部相等,那麼就會遍歷所有的元素,時間複雜度就是o(n);最好的情況就是一直使用二分查詢,直到找到最小值,時間複雜度就是o(logn)
空間複雜度:在迴圈的過程中只使用了幾個臨時變數,所以空間複雜度是o(1)
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列的最小數字
1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...