題目描述:給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 請你找出所有和為 0 且不重復的三元組。
注意:答案中不可以包含重復的三元組。
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
輸入:nums = []
輸出:[]
輸入:nums = [0]
輸出:[]
第一步:可以對已有的數組作一個排序,保證數組升序排序,由左至右逐漸增大。為了后續操作做準備。
第二步:創建左右兩個指針,循環數組,將i的位置的值,當作是我們自己,左右指針分別指向兩個隊友(兩個數)。
第三步:每一次都做驗證,三個值相加,看一下三個值相加的結果到底是大了還是小了。
第四步:移動指針,由于目前數組已經有序了,如果值大于0 則大的數小一些即可,右指針左移,反之小于0左指針右移
public List<List<Integer>> threeSum2(int[] nums) {int n = nums.length;List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < n; i++) {if (nums[i] > 0) break;if (i > 0 && nums[i] == nums[i - 1]) continue; int leftPoint = i + 1; int rightPoint = n - 1; // 右指針為n-1 就是循環完全部數組while (leftPoint < rightPoint) {int num = nums[i] + nums[leftPoint] + nums[rightPoint];if (num == 0) {result.add(Arrays.asList(nums[i], nums[leftPoint], nums[rightPoint])); leftPoint++;rightPoint--; while (leftPoint < rightPoint && nums[leftPoint] == nums[leftPoint - 1]) leftPoint++;while (leftPoint < rightPoint && nums[rightPoint] == nums[rightPoint + 1]) rightPoint--;} else if (num < 0)leftPoint++;elserightPoint--;}}return result;
}
復雜度分析
我們程序中使用了一個for循環加若干個while,但是我們會發現while循環的整體次數 其實就是n的次數,所以時間復雜度應該是O(N)。
空間復雜度:只使用了幾個固定的值,如n,左指針,右指針等 所以空間復雜度是O(1)