博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3Sum
阅读量:5886 次
发布时间:2019-06-19

本文共 2441 字,大约阅读时间需要 8 分钟。

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]

 

分析:

方法一:暴力解法时间复杂度为,肯定超时

方法二:先将数组排序,然后依次遍历,每次固定一个值,使用两个指针一前一后遍历固定值之后的元素,注意避免重复元素,

  代码一:

class Solution(object):    def threeSum(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        nums.sort()        res = []        for i in range(len(nums)-2):            l = i+1            r = len(nums)-1            while l < r:                while l < r and nums[i]+nums[l]+nums[r] == 0:                    res_tmp = [nums[i],nums[l],nums[r]]                    if res_tmp not in res:                        res.append(res_tmp)                    while l < r and nums[l+1] == nums[l]:                        l += 1                    while l < r and nums[r-1] == nums[r]:                        r -= 1                    l += 1                    r -= 1                while l < r and nums[i]+nums[l]+nums[r] > 0:                    r -= 1                while l < r and nums[i]+nums[l]+nums[r] < 0:                    l += 1        return res

此代码最终也是超时

  代码二:

class Solution(object):    def threeSum(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        size = len(nums)        ans = []        if size <= 2:            return ans        nums.sort()        i = 0        while i < size -2:            tmp = 0 - nums[i]            j = i + 1            k = size -1            while j < k:                if nums[j] + nums[k] < tmp:                    j += 1                elif nums[j] + nums[k] > tmp:                    k -= 1                else:                    ans.append([nums[i],nums[j],nums[k]])                    j += 1                    k -= 1                    while j < k:                        if nums[j] != nums[j - 1]:                            break                        if nums[k] != nums[k + 1]:                            break                        j += 1                        k -= 1            i += 1            while i < size - 2:                if nums[i] != nums[i - 1]:                    break                i += 1        return ans

此代码可以AC,注意和代码一做对比。

 

转载于:https://www.cnblogs.com/Peyton-Li/p/8093004.html

你可能感兴趣的文章
学习笔记之软考数据库系统工程师教程(第一版)
查看>>
PHP 程序员的技术成长规划
查看>>
memcached 分布式聚类算法
查看>>
jquery css3问卷答题卡翻页动画效果
查看>>
$digest already in progress 解决办法——续
查看>>
mysql 数据类型
查看>>
Ubuntu 设置当前用户sudo免密码
查看>>
ionic 调用手机的打电话功能
查看>>
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
判断点是否在三角形内
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
那些年追过的......写过的技术博客
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
CSS魔法堂:Transition就这么好玩
查看>>