[Swift]LeetCode646. 最長數對鏈 | Maximum Length of Pair Chain

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-mlhqtuiw-me.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

You are given n pairs of numbers. In every pair, the first number is always smaller than the second number.git

Now, we define a pair (c, d) can follow another pair (a, b) if and only if b < c. Chain of pairs can be formed in this fashion.github

Given a set of pairs, find the length longest chain which can be formed. You needn't use up all the given pairs. You can select pairs in any order.微信

Example 1:this

Input: [[1,2], [2,3], [3,4]]
Output: 2
Explanation: The longest chain is [1,2] -> [3,4] 

Note:spa

  1. The number of given pairs will be in the range [1, 1000].

給出 n 個數對。 在每個數對中,第一個數字老是比第二個數字小。code

如今,咱們定義一種跟隨關係,當且僅當 b < c 時,數對(c, d) 才能夠跟在 (a, b) 後面。咱們用這種形式來構造一個數對鏈。orm

給定一個對數集合,找出可以造成的最長數對鏈的長度。你不須要用到全部的數對,你能夠以任何順序選擇其中的一些數對來構造。htm

示例 :blog

輸入: [[1,2], [2,3], [3,4]]
輸出: 2
解釋: 最長的數對鏈是 [1,2] -> [3,4]

注意:

  1. 給出數對的個數在 [1, 1000] 範圍內。

Runtime: 236 ms
Memory Usage: 19.1 MB
 1 class Solution {
 2     func findLongestChain(_ pairs: [[Int]]) -> Int {
 3         var pairs = pairs
 4         var res:Int = 0
 5         var end:Int = Int.min
 6         pairs.sort(by:{(a:[Int],b:[Int]) -> Bool in 
 7                        return a[1] < b[1]                      
 8                       })
 9         for pair in pairs
10         {
11             if pair[0] > end
12             {
13                 res += 1
14                 end = pair[1]
15             }
16         }
17         return res
18     }
19 }

284ms

 1 class Solution {
 2     func findLongestChain(_ pairs: [[Int]]) -> Int {
 3         let sortPairs = pairs.sorted { $0[1] < $1[1] }
 4         var ans = 0, curEnd = Int.min
 5         for pair in sortPairs {
 6             if pair[0] > curEnd {
 7                 ans += 1
 8                 curEnd = pair[1]
 9             }
10         }
11         return ans
12     }
13 }

296ms

 1 class Solution {   
 2     func findLongestChain(_ pairs: [[Int]]) -> Int {
 3     guard pairs.count > 1 else{
 4         return pairs.count
 5     }
 6     let sorted = pairs.sorted(by: {$0[1] < $1[1]})
 7     var count : Int = 1
 8     var currentPair = sorted[0]
 9     for pair in sorted{
10         if pair.first! > currentPair.last!{
11             count += 1
12             currentPair = pair
13         }
14     }    
15     return count    
16     }
17 }

1260ms

 1 sample 1260 ms submission
 2 class Solution {
 3     func findLongestChain(_ pairs: [[Int]]) -> Int {
 4         let n = pairs.count
 5         if n <= 1{ return n }
 6         
 7         let sorted = pairs.sorted { $0[0] < $1[0] }
 8         var f = [Int](repeating: 1, count: n)
 9         var result = 1
10         
11         for i in 1..<n {
12             for j in 0..<i {
13                 if sorted[j][1] < sorted[i][0] {
14                     f[i] = max(f[i], f[j] + 1)
15                     result = max(result, f[i])
16                 }
17             }
18         }
19         
20         return result
21     }
22 }

1272ms

 1 class Solution {
 2     func findLongestChain(_ pairs: [[Int]]) -> Int {
 3         guard pairs.count > 1 else { return 1 }
 4         let pairs = pairs.sorted(by: {
 5             return $0[0] < $1[0]
 6         })
 7         
 8         let n = pairs.count
 9         var dp: [Int] = Array(repeating: 0, count: n)
10         dp[0] = 1
11         
12         for i in  1 ..< n {
13             for j in 0 ..< i {
14                 if pairs[i][0] > pairs[j][1] {
15                     dp[i] = max(dp[i], dp[j])
16                 }
17             }
18             dp[i] += 1
19         }
20         
21         return dp[n - 1]
22     }
23 }
相關文章
相關標籤/搜索