1. 程式人生 > 實用技巧 >閉包與let塊級作用域實現非同步節點控制

閉包與let塊級作用域實現非同步節點控制

問題描述

給定一個包含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 = new
ArrayList<>(); 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; }