题目
思路
1、先进行sort,将数组按序排列
2、遍历三个数中的mid
3、判断sum,根据sum和0的差值调整left 和 right
4、回归了TwoSum
5、需要去重,去重的时候记得倒序遍历,不然迭代器溢出
代码
import std.sort.SortByExtension
import std.collection.*
class Solution {
func threeSum(nums: Array<Int64>): ArrayList<ArrayList<Int64>> {
var anses = ArrayList<ArrayList<Int64>>()
nums.sortBy(stable: true){ rht: Int64, lht: Int64 =>
if (rht < lht) {
return Ordering.LT
}
if (rht > lht) {
return Ordering.GT
}
return Ordering.EQ
}
// for(num in nums){
// print(num)
// print(" ")
// }
// println(" ")
for(i in 1..nums.size-1){
// println(i)
var left = i-1
var right = i+1
while(true){
var sum = nums[left]+nums[i]+nums[right]
// println('check ${nums[left]} ${nums[i]} ${nums[right]} = ${sum}')
// println("left = ${left}, i = ${i}, right = ${right}")
if(sum == 0) {
anses.insert(0, ArrayList<Int64>(nums[left],nums[i],nums[right]))
// println("match succ!")
left--
while(left >= 0 && nums[left]==nums[left+1]) {
left--
}
right++
while(right < nums.size && nums[right]==nums[right-1]){
right++
}
if(left < 0 || right > nums.size-1){
break
}
}
else if(sum > 0) {
left--
while(left >= 0 && nums[left]==nums[left+1]) {
left--
}
if(left < 0) {
break
}
}
else if(sum < 0) {
right++
while(right <= nums.size-1 && nums[right]==nums[right-1]){
right++
}
if(right > nums.size-1) {
break
}
}
}
// println("breaksuss")
}
var toRemoves = ArrayList<Int64>()
for(i in 0..anses.size){
for(j in i+1..anses.size){
// println("i ${i}, j ${j}")
if(anses[i] == anses[j]){
// println("i ${i}, j ${j}")
toRemoves.insert(toRemoves.size,i)
break
}
}
}
// println("mark succ")
for(i in toRemoves.size-1..=0:-1){
anses.remove(toRemoves[i])
}
return anses
}
}
复杂度
时间O(n^2)
空间O(n)
遇到的坑
1、sort函数需要import std.sort.SortByExtension
2、ArrayList需要import std.collection.*
3、sortBy需要lmbda函数,没研究直接sort
4、三元组需要顺序相同才可以直接==
,所以前面需要按序insert
5、remove的时候记得倒序,不然把前面的删了后面顺序就变了