第 30 天就來寫算是經典的 3Sum 吧!
請回傳所有 3 個元素加起來和為 0 的組合,這三個元素的索引不能重複,組合也不能重複。
例如,當傳入一個這樣的數組時
0 1 2 3 4
[0, 0, 0, 0, 0]
只會有一個數組
0 1 2
[[0, 0, 0]]
先排序再走訪就可以避過相同的數值,每次走訪時,當目前的元素和前一個索引的數值相同時就可以跳過不處裡。
使用三個 pointers
class Solution {
func threeSum(_ nums: [Int]) -> [[Int]] {
guard nums.count >= 3 else { return [] }
let nums = nums.sorted(by: <)
var results: [[Int]] = []
for index in 0..<(nums.count-2) {
// 跳過有相符的元素
if index == 0 || nums[index] != nums[index-1] {
let target = -nums[index]
var left = index + 1
var right = nums.count - 1
while left < right {
let sum = nums[left] + nums[right]
if sum == target {
results.append([nums[index], nums[left], nums[right]])
// 跳過有相符的元素
while left < right && nums[left] == nums[left + 1] { left += 1 }
while left < right && nums[right] == nums[right - 1] { right -= 1 }
left += 1
right -= 1
} else if sum > target {
// 如果太大,就把右指標左移
right -= 1
} else {
// 如果太小,就把左指標右移
left += 1
}
}
}
}
return results
}
}
令 n 為陣列的長度
Big O | 說明 | |
---|---|---|
時間複雜度 | O(n^2) | 排序為 O(nlogn) ,走訪需要以雙層迴圈為 O(n^2) ,簡化後為 O(n^2) |
空間複雜度 | O(n) | 宣告了新的空間給排序過的陣列 |
以上,就是今天的 LeetCode in Swift ,如果有什麼問題和回饋歡迎留言一起討論,還有謝謝大家 30 天以來的支持!