閉包與let塊級作用域實現非同步節點控制
阿新 • • 發佈:2020-11-13
問題描述
給定一個包含n個整數的陣列nums
,判斷nums
中是否存在三個元素a,b,c ,使得a + b + c =0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例項:
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4], 滿足要求的三元組集合為: [ [-1, 0, 1], [-1, -1, 2] ]
解:
思路:
- 標籤:陣列遍歷;
-
首先對陣列進行排序,排序後固定一個數 nums[i],再使用左右指標指向 nums[i]後面的兩端,數字分別為 nums[low] 和 nums[high],計算三個數的和 sum 判斷是否滿足為 00,滿足則新增進結果集;
- 如果nums[i]大於00,則三數之和必然無法等於00,結束迴圈;
- 如果nums[i]==nums[i-1],則說明該數字重複,會導致結果重複,所以應該跳過;
- 當sum=0時,nums[low]==nums[low+1]則會導致結果重複,應該跳過,low++;
- 當sum=0時,nums[high]==nums[high-1]則會導致結果重複,應該跳過,high--;
- 時間複雜度:O(n^2),n為陣列長度
程式碼如下:
public static List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> ans = newArrayList<>(); if (nums == null || nums.length < 3) return ans; //對陣列排序,為了二分查詢 Arrays.sort(nums); for (int i = 0; i < nums.length - 2; i++) { //如果大於0,證明相加不可能等於0 if (nums[i] > 0) break; //num[i] == num[i-1] 為了防止重複 if(i > 0 && nums[i] == nums[i - 1]) continue; // int low = i + 1, high = nums.length - 1; while (low < high) { int sum =nums[i] + nums[low] + nums[high]; if ( sum == 0) { ans.add(Arrays.asList(nums[i], nums[low], nums[high])); while (low < high && nums[low] == nums[low + 1]) low++; while (low < high && nums[high] == nums[high - 1]) high--; low++; high--; } else if (sum < 0) { low++; } else { high--; } } } return ans; }