300上昇最長シーケンス
アレイ整数所与の疾患、最長の長さは、立ち上がりシーケンスを発見しました。
例:
入力:[10,9,2,5,3,7,101,18]
出力:4
説明:最長シーケンスが増加する[2,3,7,101]、その長さは4です。
注:
最長上昇シーケンスの様々な組み合わせがあるかもしれない、あなただけの出力に対応する長さを必要とします。
あなたのアルゴリズムの時間計算量はO(N2)でなければなりません。
高度:あなたはOにアルゴリズムの時間の複雑さを軽減(N Nログ)行うことができますか?
ダイナミックプログラミング
func lengthOfLIS(nums []int) int {
if len(nums) == 0 {
return 0
}
ans:=1
maxLen := []int{1}
for i := 1; i < len(nums); i++ {
maxLenSoFar := 0
for j := 0; j < i; j++ {
if nums[i] > nums[j] {
maxLenSoFar = max(maxLen[j], maxLenSoFar)
}
}
ans=max(ans,maxLenSoFar+1)
maxLen = append(maxLen, maxLenSoFar+1)
}
return ans
}
func max(i, j int) int {
if i > j {
return i
} else {
return j
}
}
+バイナリ貪欲アルゴリズムを検索
アイデアはシンプルですが、非常に書き込みするのは面倒、境界は大きな頭を持って調整します。
func lengthOfLIS(nums []int) int {
if len(nums)<=1{
return len(nums)
}
minNums := []int{nums[0]}
mlen := 0
for i := 1; i < len(nums); i++ {
if nums[i] > minNums[mlen] {
minNums = append(minNums, nums[i])
mlen++
} else {
left, right := 0, len(minNums)-1
mid := (left + right) / 2
for left < right {
if nums[i] > minNums[mid] {
left = mid+1
} else if nums[i] < minNums[mid] {
right = mid
} else {
right=mid
break
}
mid = (left + right) / 2
}
minNums[right]=nums[i]
}
}
return len(minNums)
}