LeetCode 打卡 Day 15 — 三数之和

1、题目

2、题解

1)首先直觉想到暴力解法,即三重循环整个数组,遍历所有可能的三元组,计算其和是否为0。面对不能有相同三元组的情况,也采用了直接遍历一一对比的方式。程序可以跑通,但代价就是由于时间复杂度过高,代码难以通过较长的测试用例,最终提交失败。

代码如下

func threeSum(nums []int) [][]int {
    values := [][]int{}
    l := len(nums)

    if l<3{
        return values
    }

    for key1, value1 := range nums{
        for key2:=key1+1; key2<l; key2++{
            value2 := nums[key2]
            for key3:=key2+1; key3<l; key3++{
                value3 := nums[key3]
                if value1+value2+value3==0{
                    r := []int{value1,value2,value3}
                    if isExit(values, r){
                        values = append(values,r)
                    }
                }
            }
        } 
    }
    return values
}

func isExit(a [][]int, b []int) bool{
    if len(a) == 0{
        return true
    }

    for _, value := range a{
        v := []int{value[0],value[1],value[2]}
        for i, v1 := range b{
            j := IsContainInt(v, v1) 
            if j==-1{
                break
            }
            v = append(v[:j], v[j+1:]...)
            if i==2{
                return false
            }
        }
    }
    return true
}

func IsContainInt(items []int, item int) int {
	for i, eachItem := range items {
		if eachItem == item {
			return i
		}
	}
	return -1
}

提交结果如下

 

2)查看官网题解,果然题目的难度在于如何消除重复的三元组,具体方法如下:

(1)将数组排序,按照顺序遍历获取三元组。

(2)为了防止数组内存在重复的数字,导致三元组出现重复,所以在遍历时要求前后两次遍历的数字不能相同。

补:减小时间复杂度的方法

(1)通过两头指针减小时间复杂度 因为要求a+b+c=0,所以随着遍历当b'>b时,必有c'<c,所以在2重遍历的过程中可同时反方向进行三重遍历。

代码如下:

func threeSum(nums []int) [][]int {
    values := [][]int{}
    numsLen := len(nums)
    first,second,thrid := 0,1,numsLen-1
    
    sort.Ints(nums)
    for ; first<numsLen-2; first++{
        if first>0 && nums[first-1]==nums[first]{
            continue
        }
        for second, thrid = first+1, numsLen-1; second<thrid; second++{
            if second>first+1 && nums[second-1]==nums[second]{
                continue
            }
            for nums[first]+nums[second]+nums[thrid]>0 && thrid>second{
                thrid--
            }
            if nums[first]+nums[second]+nums[thrid]==0 && second<thrid{
                r := []int{nums[first],nums[second],nums[thrid]}
                values = append(values,r)
                thrid--
            }
        }
    }
    return values 
}

提交结果如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值