当前位置:网站首页>【leetcode】剑指 Offer II 007. 数组中和为 0 的三个数(双指针)
【leetcode】剑指 Offer II 007. 数组中和为 0 的三个数(双指针)
2022-08-03 19:24:00 【friedrichor】
剑指 Offer II 007. 数组中和为 0 的三个数
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
- 0 < = n u m s . l e n g t h < = 3000 0 <= nums.length <= 3000 0<=nums.length<=3000
- − 1 0 5 < = n u m s [ i ] < = 1 0 5 -10^5 <= nums[i] <= 10^5 −105<=nums[i]<=105
题解
这道题其实是剑指 Offer II 006. 排序数组中两个数字之和 的进阶版,可以参考上道题的思路来进一步解决这道题。
方法一:穷举
具体实现略。
方法二:固定一个值 + 双指针
这个方法可以先看剑指 Offer II 006. 排序数组中两个数字之和 的【方法三:双指针】
首先把 nums 按从小到大排列,固定第一个值 i,0 - nums[i] 即为上一题的 target,然后剩下两个数的查找方法就用上一题双指针的方法即可。此外,这里还要注意去重的问题,因为题目中要求是 不重复 的三元组。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort() # 从小到大排序
length = len(nums)
for i in range(length - 2):
if i > 0 and nums[i] == nums[i-1]: # 去重
continue
low = i + 1
high = length - 1
while low < high:
if nums[i] + nums[low] + nums[high] == 0:
res.append([nums[i], nums[low], nums[high]])
while low < high: # 去重
low += 1
if nums[low] != nums[low - 1]:
break
while low < high: # 去重
high -= 1
if nums[high] != nums[high + 1]:
break
elif nums[i] + nums[low] + nums[high] > 0:
high -= 1
else:
low += 1
return res
在上一道题中还有个二分查找的方法,不过这题用二分法就需要遍历两次,且去重等条件的实现有些复杂,不推荐使用。
边栏推荐
- CS kill-free pose
- 从文本匹配到语义相关——新闻相似度计算的一般思路
- Power button brush the topic of merging two orderly array
- 红日安全内网渗透靶场-VulnStack-1
- Postgresql source code (65) analysis of the working principle of the new snapshot system Globalvis
- idea——同一项目开启多个实例(不同端口)
- go语言实现导出string字符串到文件中
- 入门3D建模基础教程详细分解
- Matlab论文插图绘制模板第42期—气泡矩阵图(相关系数矩阵图)
- Postgresql-xl全局快照与GTM代码走读(支线)
猜你喜欢

FreeRTOS中级篇

网络协议-TCP、UDP区别及TCP三次握手、四次挥手

LeetCode 622. 设计循环队列

Confused!Ali was abused on the one hand, but was fortunate to be promoted to Huawei's technology, and successfully got the offer, with an annual salary of 40w

基础软件与开发语言开源论坛| ChinaOSC

Shell programming loop statement

MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单

flex布局

OneNote 教程,如何在 OneNote 中设置页面格式?

安装radondb mysql遇到问题
随机推荐
力扣刷题之移动零
The addition and subtraction of the score of the force deduction brush question (a daily question 7/27)
MySQL基础
OneNote 教程,如何在 OneNote 中设置页面格式?
分享即时通讯开发之WebSocket:概念、原理、易错常识、动手实践
ctfshow php features
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
虚拟机vmware设置桥接模式上网
告诉你0基础怎么学好游戏建模?
ECCV 2022 Oral | 满分论文!视频实例分割新SOTA: IDOL
友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议
阿里巴巴政委体系-第六章、阿里政委体系运作
unity3d-游戏物体控制方法
Unity获取canvas 下ui 在屏幕中的实际坐标
讯方实训云平台——加速教育高质量发展的“数字底座”!
网络协议-TCP、UDP区别及TCP三次握手、四次挥手
U-Net生物医学图像分割讲解(Convolutional Networks for BiomedicalImage Segmentation)
力扣刷题之求两数之和
【木马免杀】
Radondb mysql installation problems