classSolution { funfindLongestChain(pairs: Array<IntArray>): Int { pairs.sortBy { a -> a[0] } val dp = Array(pairs.size) { 1 } var max = 1 for (i in0 until pairs.size) { for (j in0 until i) { if (pairs[j][1] < pairs[i][0]) { dp[i] = if (dp[i] < dp[j] + 1) dp[j] + 1else dp[i] max = if (max < dp[i]) dp[i] else max } } } return max } }
方法二:贪心
和会议安排类似,将pairs按照右边界进行升序排序
当每次都在满足条件的数对中选右边界最小的数对构成数链时,最后的结果自然是最优的
时间复杂度:O(N)
空间复杂度:O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { funfindLongestChain(pairs: Array<IntArray>): Int { pairs.sortBy { a -> a[1] } var max = 0 var rightWall=Int.MIN_VALUE for (i in0 until pairs.size) { if(pairs[i][0]>rightWall){ rightWall=pairs[i][1] max++ } } return max } }