【边学边敲边记】LeetCode006:三数之和

简介: 【边学边敲边记】LeetCode006:三数之和

简说Python,号主老表,Python终身学习者,数据分析爱好者,从18年开始分享Python知识,原创文章227篇,写过Python、SQL、Excel入门文章,也写过Web开发、数据分析文章,老表还总结整理了一份2022Python学习资料和电子书资源,关注后私信回复:2022 即可领取。

image.png

一、写在前面

上一题传输门:LeetCode005:最长公共前缀

今天给大家分享的是LeetCode 数组与字符串 第六题:三数之和,为面试而生,期待你的加入。

二、今日题目

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

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

示例:

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

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

三、 分析

看到这个题目第一眼,我想到的就是两数之和,咋一眼感觉上没有太大区别,实际是二维空间和三维空间的区别,最开始想的是和两数之和方法类似,这里我只要找到两数之和的相反数是不是在列表就行了,但真的实践起来,比较麻烦,时间复杂度先不说,就是思想上随便一说都是个麻烦事情,所以X先生果断放弃了这样掉头发不讨好的方法,换了一种思想,头+尾搜索法:头部循环,尾部从两端向中间搜索,思想如下:

image.png

我的思想

四、解题

  • 我的方法:
    从从中心向外扩散,时间复杂度:小于O(n^2)

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # 列表排序,从小到大
        nums.sort()
        # [-4, -1, -1, 0, 1, 2]
        res_list = []
        # 头部循环查找
        for i in range(len(nums)):
            if i == 0 or nums[i] > nums[i - 1]:
                # 最左端
                l = i + 1  
                # 最右端
                r = len(nums) - 1
                while l < r:  # 正在查找
                    three_sum = nums[i] + nums[l] + nums[r]
                    if three_sum == 0:
                        res_list.append([nums[i], nums[l], nums[r]])
                        l += 1 # 右移一位
                        r -= 1 # 左移一位
                        while l < r and nums[l] == nums[l - 1]:
                            # 从左往右,相同数值直接跳过
                            l += 1
                        while r > l and nums[r] == nums[r + 1]:
                            # 从右往左,相同数值直接跳过
                            r -= 1
                    elif three_sum > 0:
                        # 大于零,右边数值大,左移
                        r -= 1
                    else:
                        # 小于零,左边数值小,右移
                        l += 1
        return res_list
  • 提交结果

image.png

提交结果


测试数据:313组
运行时间:740ms
击败人百分比:81.35%

五、疑惑

这里说一下上一篇最长公共前缀大牛方法中的zip()。

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,
需手动 list() 转换。

六、结语

坚持 and 努力 : 终有所获。

相关文章
|
存储 安全
office软件2016版本下载安装教程——office全版本软件安装包
office软件2016版本下载安装教程——office全版本软件安装包
1000 0
|
前端开发 Java 文件存储
JAVA 文件上传 和 下载
文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
|
应用服务中间件 网络安全 nginx
Nginx配置WebSocket 【支持wss与ws连接】
Nginx配置WebSocket 【支持wss与ws连接】
9955 1
|
传感器 数据采集 JSON
RS232/RS485转4G DTU 上传基于Modbus协议的温湿度传感器数据到远程TCP服务器
RS232/RS485转4G DTU 上传基于Modbus协议的温湿度传感器数据到远程TCP服务器
951 0
RS232/RS485转4G DTU 上传基于Modbus协议的温湿度传感器数据到远程TCP服务器
|
传感器 人工智能 物联网
柔性电子技术:可穿戴设备与智能生活的未来
【9月更文挑战第14天】柔性电子技术作为一种新兴且充满潜力的技术,正逐步成为连接可穿戴设备与智能生活的桥梁。它以其独特的灵活性和适应性,为我们的生活带来了更多的可能性和便捷性。尽管目前仍面临诸多挑战,但随着科技的不断进步和创新的推动,柔性电子技术必将迎来更加美好的未来。
|
存储 安全 Java
Java Queue:从入门到精通,一篇文章就够了!
【6月更文挑战第18天】Java集合框架中的队列Queue遵循FIFO原则,用于存储和管理元素。从创建队列(如LinkedList示例)到移除元素(remove和poll方法),再到不同实现类(如ArrayDeque和ConcurrentLinkedQueue),队列在多线程、任务调度等场景中广泛应用。自定义队列如LimitedQueue展示如何限制容量。了解并熟练使用队列能提升程序性能和可读性。队列,是高效编程的关键工具。
373 1
|
算法 定位技术
GPS信号的数字接收处理matlab仿真,包括频率点搜索,捕获跟踪,相关峰检测等步骤
GPS信号的数字接收处理matlab仿真,包括频率点搜索,捕获跟踪,相关峰检测等步骤
|
存储 Python
Python程序开发——Python实现可增删改查的员工管理系统
Python程序开发——Python实现可增删改查的员工管理系统
Python程序开发——Python实现可增删改查的员工管理系统
|
弹性计算 安全 关系型数据库
Terraform入门初实践
0.写在前面:在云巧资产市场中对项目进行交付过程中,能够快速复用已有组件和一键部署组件一直是我们追求的目标(关于云巧相关的理念可移步了解云巧 详细了解),因此以IaC理念出圈的Terraform,成为关注的重点。本文将介绍Terraform核心理念并结合运行demo完成对Terraform的探索和初级实践,为后续云巧市场更好的交付奠定基础。1.Terraform介绍:1.1 IACInfrastr
1427 0
Terraform入门初实践

热门文章

最新文章