找出所有滿足條件a + b + c = 0且不重復的三元組。


給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重復的三元組。

注意:答案中不可以包含重復的三元組。

 

示例:

給定數組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

1、暴力解決
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if (nums == null || nums.length < 3) {
return list;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
for (int k = j+1; k < nums.length; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
list.add(Arrays.asList(nums[i], nums[j], nums[k]));
}
}
}
}
return list;
}
但是這樣會超出時間限制,而且還沒有進行去重
2、改進版數組遍歷
 
        
 1 public static List<List<Integer>> threeSum(int[] nums) {
 2     List<List<Integer>> list = new ArrayList<>();
 3     if(nums == null || nums.length < 3) return list;
 4     // 先把數組中的所有數進行升序排序
 5     Arrays.sort(nums);
 6   //從頭開始遍歷數組(遍歷三個數中的第一個數)
 7     for (int i = 0; i < nums.length ; i++) {
 8         // 如果當前要計算的第一個數字大於0,則其之后的數字一定大於0(因為已經排序了),所以三數之和一定大於0,結束循環
 9         if(nums[i] > 0) {break;}
10         // 對三個數中的第一個數字去重
11         if(i > 0 && nums[i] == nums[i-1]) {continue;}
12         // 第二個數下標地址
13         int L = i+1;
14         // 第三個數下標地址
15         int R = nums.length-1;
16         // 當第二個數地址L在第三個數地址R前邊的時候,遍歷所有情況
17         while(L < R){
18             // 對三個數字中的第二個數去重
19             while (L < R && nums[L] == nums[L+1]) {L++;}
20             // 對三個數中的第三個數去重
21             while (L < R && nums[R] == nums[R-1]) {R--;}
22             int sum = nums[i] + nums[L] + nums[R];
23             if(sum == 0){
24                 list.add(Arrays.asList(nums[i],nums[L],nums[R]));
25                 //當sum==0時,第一個數保持不變的情況下,第二和第三個數不能再重復了,所以左邊的L向后繼續編遍歷,右邊的R向前繼續遍歷
26                 L++;
27                 R--;
28             }
29             // 當sum<0說明左邊的數num[L]太小了,所以要左邊的地址+1繼續向后遍歷
30             else if (sum < 0) {L++;}
31             // 當sum>0說明右邊的數num[R]太大了,所以要右邊的地址-1繼續向前遍歷
32             else if (sum > 0) {R--;}
33         }
34     }
35     return list;
36 }
 
        

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM