알고리즘

릿코드 300. Longest Increasing Subsequence 코틀린

rkrkrr0101 2024. 1. 5. 11:51

가장 긴 증가하는 수열 찾기
현재위치포인터를 만들고,
현재위치보다 해당값이 크면 마지막에 삽입하고 포인터증가
현재위치보다 해당값이 작으면 a1<=해당값<a2에서 a1이랑 치환

정답

class Solution {
    fun lengthOfLIS(nums: IntArray): Int {

        val lengthList = mutableListOf<Int>()
        lengthList.add(nums[0])
        for (i in nums){
            val prevValue = lengthList.last()
            if (i>prevValue){
                lengthList.add(i)
            }else{
                val lowerBoundValue=lowerBound(lengthList,i)
                lengthList[lowerBoundValue]=i
            }
        }

        return lengthList.size
    }
    fun lowerBound(calList:List<Int>,target:Int):Int{
        var left=0
        var right=calList.size
        while (left<right){
            val mid=(left+right)/2
            if(calList[mid]<target){
                left=mid+1
            }else{
                right=mid
            }
        }
        return right
    }
}