1. 程式人生 > >154. 尋找旋轉排序陣列中的最小值 II-H

154. 尋找旋轉排序陣列中的最小值 II-H

154. 尋找旋轉排序陣列中的最小值 II(find-minimum-in-rotated-sorted-array-ii)

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

注意陣列中可能存在重複的元素。

示例 1:

輸入: [1,3,5]
輸出: 1
示例 2:

輸入: [2,2,2,0,1]
輸出: 0
說明:

這道題是 尋找旋轉排序陣列中的最小值 的延伸題目。
允許重複會影響演算法的時間複雜度嗎?會如何影響,為什麼?
  • 分析

    這道題確實很難,難在如何用二分,處理相等的資料上,以及邊界的判斷,當然這個圖最好表示
    ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181123143247188.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NjeWxoeQ==,size_16,color_FFFFFF,t_70)
    
  • code

package main

import "fmt"

func findMin(nums []int) int {
	s:=len(nums)
	if nums[0]<nums[s-1]{
		return nums[0]
	}
	var i,j int
	j=s-1
	for i<j&&nums[i]>=nums[j]{
		m:=i+(j-i)/2
		fmt.Println(i,j,m)
		if nums[m]>nums[i]{
			i=m+1
		}else if nums[m]<nums[i]{
			j=m
		}else
{ i+=1 } } fmt.Println(i,j) return nums[i] } func main(){ fmt.Println(findMin([]int{4,5,6,7,0,1,2})) fmt.Println(findMin([]int{3,4,5,1,2})) fmt.Println(findMin([]int{1,1,1,0,1})) fmt.Println(findMin([]int{1,0,1,1,1})) }