1. 程式人生 > 實用技巧 >一週刷完劍指offer-6-旋轉陣列的最小數字

一週刷完劍指offer-6-旋轉陣列的最小數字

從尾到頭列印單鏈表值

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] 

如果您覺得本文有用,請點個“在看”