如何使用 C# 查詢所有接近零的唯一四元組?


簡單的方法是我們可以建立四個巢狀迴圈,並逐一檢查所有四個元素的和是否為零。如果四個元素的和為零,則列印元素。

時間複雜度 − O(n4)

空間複雜度 − O(1)

我們可以使用無序集合資料結構來儲存陣列的每個值。集合提供了在 O(1) 時間內搜尋元素的優勢。因此,對於陣列中的每一對,我們將查詢其和的負數,該負數可能存在於集合中。如果找到這樣的元素,那麼我們可以列印三元組,它將是整數對及其和的負值。

時間複雜度 − O(n3)

空間複雜度 − O(n)

示例

public class Arrays{
   public List<List<int>> FourSum(int[] nums){
      List<List<int>> res = new List<List<int>>();
      if (nums == null || nums.Length == 0){
         return null;
      }
      int[] newNums = nums.OrderBy(x => x).ToArray();
      for (int i = 0; i < newNums.Length; i++){
         for (int j = i; j < newNums.Length; j++){
            int left = j + 1;
            int right = newNums.Length - 1;
            while (left < right){
               int sum = newNums[i] + newNums[j] + newNums[left] + newNums[right];
               if (sum == 0){
                  List<int> sums = new List<int>();
                  sums.Add(newNums[i]);
                  sums.Add(newNums[j]);
                  sums.Add(newNums[left]);
                  sums.Add(newNums[right]);
                  res.Add(sums);
                  int leftValue = newNums[left];
                  int rightValue = newNums[right];
                  while (left < nums.Length && leftValue == nums[left]){
                     left++;
                  }
                  while (right > left && right == nums[right]){
                     right--;
                  }
               }
               else if (sum < 0){
                  left++;
               }
               else{
                  right--;
               }
            }
            while (j + 1 < nums.Length && nums[j] == nums[j + 1]){
               j++;
            }
         }
         while (i + 1 < nums.Length && nums[i] == nums[i + 1]){
            i++;
         }
      }
      return res;
   }
}

static void Main(string[] args){
   Arrays s = new Arrays();
   int[] nums = { 1,0,-1,0,-2,2 };
   var ss = FourSum(nums);
   foreach (var item in ss){
      foreach (var item1 in item){
         Console.WriteLine(item1);
      }
   }
}

輸出

[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

更新時間: 2021年8月17日

185 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.