配列は、事前にあなたにいくつかのピボット不明で回転させ、昇順にソートしたとします。
(すなわち、[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
注:
これが回転ソート配列の最小を見つけるために、フォローアップの問題です。
重複が実行時の複雑さに影響を与えることができますか?方法と理由?
func findMin(nums []int) int {
lg := len(nums)
l := 0
r := lg - 1
if l+1 > r {
return min(nums[l], nums[r])
}
for l < r {
mid := (l + r) / 2
if nums[r] > nums[mid] {
r = mid
} else if nums[r]==nums[mid]{
if findLeftbound(nums,mid) {
r = mid
} else {
l = mid+1
}
} else {
l = mid + 1
}
}
return nums[l]
}
func min(i int, j int) int {
if i < j {
return i
} else {
return j
}
}
func findLeftbound(nums []int, mid int) bool {
for i:=mid;i>=0;i--{
if nums[i]< nums[mid] {
return true
}
}
return false
}