Leetcode 15. 三数之和

题目内容:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

难点:

判断三元组是否重复

思路:

1. 最开始想法是进行暴力三层for循环,再进行重复数组的删除,但这样判断很麻烦;

2.减少for循环,可以通过:对数组排序+双指针的方式;

3.先对数组进行排序,有一层for循环,假设i从下标0的地方开始,同时定一个left指针在i+1的位置上,定义right指针在数组结尾的位置上。如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,right指针就应该向左移动,这样才能让三数之和小一些。如果 nums[i] + nums[left] + nums[right] < 0 说明三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。

4.接着进行每个指针的去重。

5.由于现在数组是排序后的,因此去重逻辑只需要对相邻元素进行判断即可。i指针当前位置和前一位数值相同,则代表该数组已经被统计过了,因此直接跳过(判断代码在10-11行);left和right指针对即将进行遍历的指针进行对比,如果相同,则表示已经遍历过。

完整代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值