「刷刷刷」15.三数之和
题目
难度:中等
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
思路
审题:最重要的一点是:不能重复。如果只是简单的三重循环去枚举所有可能,无法很好地解决不重复的问题。
那么有一个比较巧的办法是,先给数组排个序,再进行三重循环,每一重遍历的值都比上一重大,就可以避免这个问题。也就是找到的三元组:(a, b, c),一定是满足 a <= b <= c的,不会出现 (b, a, c),(b, c, a) 这种重复的情况。
既然数组已经是有序的了,还可以这样优化:第一层循环从小往大遍历,在每一次循环内,先取循环到的数字a,比a大的下一个数字b,和最后一个数字c。
- 如果 a + b + c < 0,则说明整体偏小,应该让c不动,b变大一点,也就是指向后一位数字。
- 如果 a + b + c > 0,则说明整体偏大,应该让b不动,c变小一点,也就是指向前一位数字。
- 在这个过程中如果找到等于0的情况,则说明这一次a值的循环找到了答案,去遍历下一个a。如果b和c相遇了还没找到等于0,那说明这个a值没有答案,也去遍历下一个a。
需要注意的是要跳过相等的元素,否则会有重复结果。
也就是说,先对数组排序。
然后遍历数组,固定一位数字a,一个指针B指向a下一位,一个指针C指向末尾元素。
判断 a + b + c ? 0,如果小于0,指针B右移;如果大于0,指针C左移。
注意指针移动时跳过相等的数字。
代码
1 | class Solution { |
作者:prik
永久链接: https://trzoey.github.io/blog-prik/algorithmic/15.三数之和/
转载请注明出处,谢谢合作💓。