大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说【数组、双指针】day3_15. 三数之和,希望您对编程的造诣更进一步.
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != 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] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2
输入: nums = [0,1,1]
输出: []
解释: 唯一可能的三元组和不为 0 。
示例 3
输入: nums = [0,0,0]
输出: [[0,0,0]]
解释: 唯一可能的三元组和为 0 。
提示
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
题解
思路:
1.数组排序 2.遍历数组,先取出一个数nums[i],将三数之和转换为两数之和,另外两个数采用双指针的方式从两侧取,需要注意:i,j,k需要排除重复的数
时间复杂度:O(n^2) 空间复杂度:O(n)
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
if (nums[i] > 0) {
return result;
}
// 另外两个数从两边取
int start = i + 1, end = nums.length - 1;
int target = -nums[i];
while (start < end) {
int num = nums[start] + nums[end];
if (num == target) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[start]);
list.add(nums[end]);
result.add(list);
start++;
end--;
//start end 去重
while (start < end && nums[start] == nums[start - 1]) {
start++;
}
while (start < end && nums[end] == nums[end + 1]) {
end--;
}
} else if (num < target) {
start++;
} else {
end--;
}
}
// i去重
while (i < nums.length - 2 && nums[i + 1] == nums[i]) {
i++;
}
}
return result;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36790.html