一週刷完劍指offer-6-旋轉陣列的最小數字
阿新 • • 發佈:2020-09-17
從尾到頭列印單鏈表值
1. 題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。
2. 示例
例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。
NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
3. 解題思路
第一種方法:
這道題是二分查詢的變形,注意到旋轉陣列的首元素肯定不小於旋轉陣列的尾元素,設定中間點。
如果中間點大於首元素,說明最小數字在後面一半,如果中間點小於尾元素,說明最小數字在前一半。依次迴圈。
當一次迴圈中首元素小於尾元素,說明最小值就是首元素。
但是當首元素等於尾元素等於中間值,只能在這個區域順序查詢。如:【1,2,2,3,4】 --> 【2,3,4,1,2】
第二種方法:簡單,直接遍歷 複雜度較高
4. Java實現
方法一:
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { int len = array.length; if (len == 0){ return 0; } // 如果第一個數字 都比最後一個數字小,則代表沒有旋轉 int left = 0; int right = len - 1; if (array[left] < array[right]){ return array[left]; } int mid; int minVal = array[left]; while ((right - left) > 1){ mid = (right + left) / 2; if (array[left] <= array[mid]){ left = mid; }else if (array[right] >= array[mid]){ right = mid; }else if ((array[left] == array[mid]) && array[mid] == array[right]){ // 只能遍歷找到最小的值 for (int i = 0; i < len; i++){ if (minVal > array[i]){ minVal = array[i]; right = i; } } } } return array[right]; } }
方法二:直接遍歷
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { // 直接使用遍歷的方法 if (array.length == 0){ return 0; } int minVal = array[0]; for (int i = 0; i < array.length; i++){ if (minVal > array[i]){ minVal = array[i]; } } return minVal; } }
5. Python實現
第一種:
-*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
length = len(rotateArray)
left, right = 0, length-1
if rotateArray[left] < rotateArray[right]: #如果第一個數都比最後一個數小,則代表沒有旋轉
return rotateArray[left]
minVal = rotateArray[0]
while (right - left) > 1:
mid = (left + right) // 2
if rotateArray[mid] >= rotateArray[left]:
left = mid
elif rotateArray[mid] <= rotateArray[right]:
right = mid
elif rotateArray[right] == rotateArray[left] == rotateArray[mid]:
for i in range(length):
if minVal > rotateArray[i]:
minVal = rotateArray[i]
right = i
minVal = rotateArray[right]
return minVal
第二種:
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
minVal = rotateArray[0]
for i in range(len(rotateArray)):
if minVal > rotateArray[i]:
minVal = rotateArray[i]
res = i
return rotateArray[res]
如果您覺得本文有用,請點個“在看”