旋轉陣列的最小數字

2021-10-21 12:32:25 字數 1458 閱讀 1193

分析:根據題意可知,旋轉陣列就是將乙個遞增的陣列分成兩個遞增陣列去看待,乙個在前,乙個在後,後面的陣列是值較小的陣列,前面的陣列是值較大的陣列。

思路一:暴力法,直接遍歷。

我們已經知道,不考慮特殊情況,在前面的陣列是值較大的陣列,在後面的陣列是值較小的陣列。那麼我們可以遍歷陣列,對前後兩個數字進行比較,直到出現當前數字比前乙個數字小的情況,那麼當前數字就是在整個陣列中值最小的那乙個。

特殊情況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.分析 首先我們可以看到原陣列為遞增排序的,並且以...