【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 += 1
currLen += 1
}
// ... ... ...
}
}
需要注意的一点是,
++/--运算符在 Swift 3.0+ 当中已经被移除。
每次进入if条件句之后,在语句块结束之前,使用ans记录一次答案,最后将ans返回即可。完整的 Swift 题解:
class Solution {
func longestConsecutive(_ nums: [Int]) -> Int {
var st = Set<Int>(nums)
var ans = 0
for num in st {
if !st.contains(num - 1) {
var currNum = num, currLen = 0
while st.contains(currNum) {
currNum ++
currLen ++
}
ans = max(ans, currLen)
}
}
return ans
}
}
更多推荐


所有评论(0)