“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
- 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。
二、思路分析
- 这道题我们先将
数组排好序,接着还是利用双指针进行求解!- 首先数组
第一位固定,第二位和最后一位我们定义为首尾指针 - 三数
相加,结果大于0,则尾指针减一(排序后数组从小到大,所以尾指针向左移动越小) - 三数
相加,结果小于0,则头指针加一(排序后数组从小到大,所以头指针向右移动和越大) - 如果没有符合的条件,
固定的下标和头指针向前加一,重复上述操作
- 首先数组
三、AC 代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int target = 0;
Arrays.sort(nums);
//不足三个数直接返回
if(nums.length < 3) return result;
for(int i = 0; i < nums.length; i++){
//相同的数跳过,不需要再次计算
if(i > 0 && nums[i] == nums[i - 1])continue;
int j = i + 1;
int k = nums.length - 1;
while(j < k){
if(nums[i] + nums[j] + nums[k] < target){
j++;
//相同的数跳过,不需要再次计算
while(j < k && nums[j] == nums[j - 1])j++;
}else if(nums[i] + nums[j] + nums[k] > target){
k--;
while(j < k && nums[k] == nums[k + 1])k--;
}else{
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
j++;
k--;
while(j < k && nums[j] == nums[j - 1])j++;
while(j < k && nums[k] == nums[k + 1])k--;
}
}
}
return result;
}
}
四、总结:
- 好了,代码撸完,我们
总结一下:- 这道题运用了
双指针的解法 - 细节,要注意
先给数组排序,否则指针移动没有意义 锁定一个数,其他两个数移动即可- 三数之和大于目标值,则
尾指针向左,反之首指针向右 相等的数值跳过,因为已经比过了,没有意义
- 这道题运用了