Q32 LeetCode15 三数之和

难点在于不能重复

1.将数组进行排序

2.找到合适组合后将三个指针都要进行向后去重操作

 

 

 1 class Solution {
 2     public List<List<Integer>> threeSum(int[] nums) {
 3         Arrays.sort(nums);
 4         List<List<Integer>> ans = new ArrayList<>();
 5         int n = nums.length;
 6         for (int i = 0; i < n - 2; ++i) {
 7             int x = nums[i];
 8             if (i > 0 && x == nums[i - 1]) continue; // 跳过重复数字
 9             int j = i + 1, k = n - 1;
10             while (j < k) {
11                 int s = x + nums[j] + nums[k];
12                 if (s > 0) k--;
13                 else if (s < 0) j++;
14                 else {
15                     ans.add(List.of(x, nums[j], nums[k]));
16                     j=j+1;
17                     while(j < k&&nums[j] == nums[j - 1]){
18                         j++;
19                     }
20                     //for (j=j+1; j < k && nums[j] == nums[j - 1]; ++j); // 跳过重复数字
21                     k=k-1;
22                      while(j < k&&nums[k] == nums[k + 1]){
23                         k--;
24                     }
25                     //for (k=k-1; k > j && nums[k] == nums[k + 1]; --k); // 跳过重复数字
26                 }
27             }
28         }
29         return ans;
30     }
31 }

 

posted @ 2024-06-13 22:09  清川1  阅读(9)  评论(0)    收藏  举报