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)
}
posted @ 2020-11-23 10:30  ganshuoos  阅读(84)  评论(0编辑  收藏  举报