【Swift】LeetCode 128. 最长连续序列
128. 最长连续序列
题目描述
思路 and Swift 题解
基于这道题目,我们来对 Swift 当中的 Set 数据结构进行学习。解决这道题目的思路不难,首先,我们应该将nums
数组当中的元素存储到一个集合当中。之后,我们对集合当中的数值进行遍历,取num
为每次遍历的数值,不妨令集合的名称为st
,如果st
当中不包含num - 1
这个数值,就开始寻找一次答案。在寻找的过程中,令currNum
为当前数值num
,currLen
初始化为 0 表示当前找到的最长连续子序列的长度。如果currNum
存在于st
当中,那么currLen ++
,同时currNum ++
。
我们如何用 Swift 解决这道题目呢?思路其实也很简单,首先我们声明一个集合,它的类型是Int
,并且我们希望直接以nums
数组作为输入来初始化集合,Swift 支持这种用法(很像是 C++ 当中基于 Vector 的开始与尾后指针初始化一个 Set,但 Swift 更简单):
var st = Set<Int>(nums)
之后对集合当中的元素进行遍历,直接使用 for-loop 即可:
for num in st {... ... ...
}
然后,我们需要判断元素是否存在于集合当中,使用 Swift Set 内置的contains
方法即可:
for num in st {if !st.contains(num - 1) {... ... ...}
}
再然后,我们需要判断currNum
是否存在于st
当中,这个判断条件显然应该放在一个循环里,当条件不成立时循环需要停止。与 Golang 不同,Swift 不仅仅有 for 一种循环方式,它还有 while 循环:
for num in st {if !st.contains(num - 1) {var currNum = num, currLen = 0 // 注意, 多变量在声明时, 其声明方法与 Golang/Python 都不同, 不能写成 var currNum, currLen = num, 0. 而是应该分别声明与初始化, 与 C/C++ 相同while st.contains(currNum) {currNum += 1currLen += 1}// ... ... ...}
}
需要注意的一点是,
++/--
运算符在 Swift 3.0+ 当中已经被移除。
每次进入if
条件句之后,在语句块结束之前,使用ans
记录一次答案,最后将ans
返回即可。完整的 Swift 题解:
class Solution {func longestConsecutive(_ nums: [Int]) -> Int {var st = Set<Int>(nums)var ans = 0for num in st {if !st.contains(num - 1) {var currNum = num, currLen = 0while st.contains(currNum) {currNum ++currLen ++}ans = max(ans, currLen)}}return ans}
}