【LeetCode】15. 3Sum
阿新 • • 發佈:2018-12-22
1. 題目描述:
Given an array nums
of n integers, are there elements a, b, c in nums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
2. 思路分析:
題目的意思是找到陣列中所有3個和為0的數,並且不能重複。
該題可以轉化成Two Sum的思路去解決。先固定一個數,然後從陣列中剩下的數中查詢和為該數負值(target)得2個數,則轉化成了Two Sum問題:先排序陣列,使兩個指標分別指向首尾的兩個數,如果這兩個數和等於target,則找到,如果小於target則右移左指標,如果大於target則左移右指標。
關鍵是題目要求去重,所以每次移動指標的時候要判斷一下是否和上一個數相同,如果相同則繼續移動。
3. Java程式碼:
程式碼:
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
// 用於去重
if (i != 0 && nums[i] == nums[i - 1]) {
continue;
}
// 轉化成Two Sum 問題
int target = -nums[i];
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
List<Integer> triplets = Arrays.asList(nums[i], nums[left], nums[right]);
result.add(triplets);
left++;
right--;
// 用於去重
while (left < right && nums[left] == nums[left - 1]) {
left++;
}
while (left < right && nums[right] == nums[right + 1]) {
right--;
}
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
return result;
}