leetcode刷题笔记300题 最长上升子序列
leetcode刷题笔记300题 最长上升子序列
源地址:300. 最长上升子序列
问题描述:
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
//通过一次遍历,构建单调增的序列,对于比末尾值大的值直接添加到末尾,对于小于头部的值,直接替换头部的值,对于中间的值,通过二分查找寻找其的位置
object Solution {
def lengthOfLIS(nums: Array[Int]): Int = {
val len = nums.length
val list = scala.collection.mutable.ListBuffer[Int]()
for (num <- nums) {
if (list.length == 0 || num > list.last) list.append(num)
else{
if (num <= list(0)) list(0) = num
else{
var left = 0
var right = list.length-1
while (left < right){
val mid = (left + right + 1) >> 1
if (list(mid) < num) left = mid
else right = mid - 1
}
list(right+1) = num
}
}
}
return list.length
}
}
func lengthOfLIS(nums []int) int {
var res = []int{}
for _ , num := range nums {
if len(res) == 0 ||res[len(res)-1] < num {
res = append(res, num)
} else {
if num <= res[0] {
res[0] = num
} else {
left, right := 0, len(res)-1
for (left < right) {
mid := (left + right + 1) >> 1
if num > res[mid] {
left = mid
} else {
right = mid - 1
}
}
res[right+1] = num
}
}
}
return len(res)
}