博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版) Leetcode-15.三数之和
阅读量:4091 次
发布时间:2019-05-25

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

01 题目:三数之和

链接:https://leetcode-cn.com/problems/3sum

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例

给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:

[

  [-1, 0, 1],
  [-1, -1, 2]
]

02 解析

  1. 先从小到大排序:sort()函数
  2. 参数初始化:k从0到 len(nums)-2就够了,题里说的是a,b,c三个不同的数;i=0,j=len(nums)-1开始
  3. 保持指针k蓝色)不动:先移动指针 i (小->大 橙色),移动指针 j(大->小 绿色)
    并计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集
  4. 判断+去重
    第一个if:如果 nums[ k ]大于 0,则三数之和一定 0,结束循环
    第二个if:如果 nums[ k ] = nums[ k-1 ],则说明该数字重复,会导致结果重复,所以应该跳过
    第三个if:计算sum
        当 sum < 0 时, i++;若nums[ i ]= nums[ i+1 ],则会导致结果重复,应该跳过,i++
        当 sum > 0 时, j–;若nums[ j ]= nums[ j-1 ] 则会导致结果重复,应该跳过,j−−
        同理,当 sum = 0 时,res.append([nums[k], nums[i], nums[j]])
              若 nums [i ]= nums[ i+1 ]则会导致结果重复,应该跳过,i++
              若 nums[ j ]= nums[ j-1] 则会导致结果重复,应该跳过,j−−
    在这里插入图片描述
    时间复杂度:O(n2),n 为数组长度

03 代码

def threeSum(nums):    nums.sort() # 排序    res, k = [], 0    for k in range(len(nums) - 2):        if nums[k] > 0: break # 1. because of j > i > k.        if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.        i, j = k + 1, len(nums) - 1        while i < j: # 3. double pointer            s = nums[k] + nums[i] + nums[j]            if s < 0:                i += 1                while i < j and nums[i] == nums[i - 1]: i += 1            elif s > 0:                j -= 1                while i < j and nums[j] == nums[j + 1]: j -= 1            else:                res.append([nums[k], nums[i], nums[j]])                i += 1                j -= 1                while i < j and nums[i] == nums[i - 1]: i += 1                while i < j and nums[j] == nums[j + 1]: j -= 1    return res    # 作者:jyd    # 链接:https://leetcode-cn.com/problems/3sum/solution/3sumpai-xu-shuang-zhi-zhen-yi-dong-by-jyd/

自个第一次写这个函数的时候,没考虑到去重,而是在得出所有符合三数之和为0的组合后,才去重的。

故记录一下在嵌套列表中去重的方法

'''嵌套列表去重方法直接看[22]会有点懵,先看20, 它将a的每个小列表先转成元组,再去重,然后变成列表再看[22],后半部分是完成了元组-去重,前部分将每个小元组变成列表,再变成大列表,但是是乱序的最后是[25],sort方法通过参数key指定索引值,故指定a的下标,根据这个索引,对new列表进行排序'''In [19]: a = [[0,0,0,],[4,2,5],[1,8,6],[0,0,0],[5,3,9],[4,2,5]]In [20]: new = list(set(tuple(i) for i in a))In [21]: newOut[21]: [(5, 3, 9), (4, 2, 5), (0, 0, 0), (1, 8, 6)]In [22]: new = [list(t) for t in set(tuple(i) for i in a)]In [23]: newOut[23]: [[5, 3, 9], [4, 2, 5], [0, 0, 0], [1, 8, 6]]In [24]: new.sort(key = a.index)In [25]: newOut[25]: [[0, 0, 0], [4, 2, 5], [1, 8, 6], [5, 3, 9]]

转载地址:http://bujii.baihongyu.com/

你可能感兴趣的文章
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
删除docker容器和镜像的命令
查看>>
gazebo似乎就是在装ROS的时候一起装了,装ROS的时候选择的是ros-melodic-desktop-full的话。
查看>>
React + TypeScript 实现泛型组件
查看>>
TypeScript 完全手册
查看>>
React Native之原理浅析
查看>>
Git操作清单
查看>>