15、三数之和-cangjie

题目

15、三数之和

思路

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的时候记得倒序,不然把前面的删了后面顺序就变了

结果

cangjie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值