題解一:
? ? ? ? 雙指針遍歷:暴力解法的三層遍歷會超時,因此需要優化遍歷的過程。首先是需要對結果進行去重,這里采用排序+跳過重復值的做法,在指針遍歷時跳過已經遍歷過的相同值。在第一層循環確定第一個值后,剩下兩個符合要求的值一定是在其后相繼出現的,因此可以用雙指針從兩側逼近尋找符合的值,下面附上官方提供的偽代碼(來源. - 力扣(LeetCode))
nums.sort() for first = 0 .. n-1if first == 0 or nums[first] != nums[first-1] then// 第三重循環對應的指針third = n-1for second = first+1 .. n-1if second == first+1 or nums[second] != nums[second-1] then// 向左移動指針,直到 a+b+c 不大于 0while nums[first]+nums[second]+nums[third] > 0third = third-1// 判斷是否有 a+b+c==0check(first, second, third)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> lists = new ArrayList<>();Arrays.sort(nums);int len = nums.length;for (int i = 0; i < len; i++) {if (i == 0 || nums[i] > nums[i - 1]) {int right = len - 1;for (int left = i + 1; left < right; left++) {if (left == i + 1 || nums[left] > nums[left - 1]) {while (right > left + 1 && nums[left] + nums[right] + nums[i] > 0) {right--;}if (nums[left] + nums[right] + nums[i] == 0) {List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[left]);list.add(nums[right]);lists.add(list);}}}}}return lists;}
}