关注
算法题:三数之和
题目描述:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路:
1. 首先对数组进行排序,方便后续的去重操作。
2. 遍历数组,将当前元素作为第一个数,然后在剩下的元素中使用双指针法找到另外两个数,使得三个数的和为 0。
3. 在双指针法中,左指针指向当前元素的下一个元素,右指针指向数组的最后一个元素。如果当前三个数的和小于 0,则将左指针右移一位;如果当前三个数的和大于 0,则将右指针左移一位;如果当前三个数的和等于 0,则将这三个数加入结果集中。
4. 为了避免重复,需要在遍历数组时去重。具体来说,如果当前元素和前一个元素相同,则跳过当前元素。
代码实现:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
res.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
left++;
right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return res;
}
}
时间复杂度:O(n^2)
空间复杂度:O(logn)
查看原帖
点赞 2
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
03-25 15:32
陕西科技大学 嵌入式软件开发 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 实习要如何选择和准备? #
48022次浏览 759人参与
# 摸鱼被leader发现了怎么办 #
45519次浏览 319人参与
# 大疆求职进展汇总 #
473125次浏览 3181人参与
# 学历or实习经历,哪个更重要 #
89287次浏览 648人参与
# 潍柴工作体验 #
21409次浏览 18人参与
# 你觉得通信/硬件有必要实习吗? #
96231次浏览 893人参与
# 找工作,行业重要还是岗位重要? #
20633次浏览 360人参与
# Offer比较,求稳定还是求发展 #
43248次浏览 228人参与
# 你最满意的offer薪资是哪家公司? #
19648次浏览 120人参与
# 来聊聊机械薪资天花板是哪家 #
114006次浏览 721人参与
# 硬件兄弟们 甩出你的华为奖状 #
96999次浏览 670人参与
# 金融财会交流会 #
102614次浏览 361人参与
# 机械人与华为的爱恨情仇 #
107119次浏览 923人参与
# 24届硬件人与华为的爱恨情仇 #
121704次浏览 962人参与
# 运营面经 #
102832次浏览 1202人参与
# 机械人怎么评价今年的华为 #
192128次浏览 1502人参与
# 外包能不能当跳板? #
26852次浏览 192人参与
# 国企/银行/研究所公司爆料 #
125509次浏览 742人参与
# 国企还是互联网,你怎么选? #
128198次浏览 963人参与
# 机械专业只有考研才有出路吗 #
96947次浏览 850人参与