300上昇最長シーケンスGolangの動的プログラミングアルゴリズムバイナリ+欲張り探索

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)
}
公開された38元の記事 ウォンの賞賛0 ビュー1028

おすすめ

転載: blog.csdn.net/Cyan1956/article/details/104858686