154. 尋找旋轉排序陣列中的最小值 II-H
阿新 • • 發佈:2019-02-14
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}))
}