Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

จะค้นหาแฝดสามที่ไม่ซ้ำกันทั้งหมดที่รวมกันเป็นศูนย์โดยใช้ C # ได้อย่างไร


แนวทางง่ายๆ คือ เราสามารถสร้างลูปที่ซ้อนกันได้สามลูป และตรวจสอบทีละรายการว่าผลรวมขององค์ประกอบทั้งสามนั้นเป็นศูนย์หรือไม่ หากผลรวมขององค์ประกอบทั้งสามเป็นศูนย์ ให้พิมพ์องค์ประกอบ

ความซับซ้อนของเวลา − O(n 3 )

ความซับซ้อนของอวกาศ − O(1)

เราสามารถใช้โครงสร้างข้อมูลชุดที่ไม่เรียงลำดับเพื่อเก็บแต่ละค่าของอาร์เรย์ Set ให้ประโยชน์ของการค้นหาองค์ประกอบในเวลา O(1) ดังนั้น สำหรับแต่ละคู่ในอาร์เรย์ เราจะมองหาค่าลบของผลรวมที่อาจมีอยู่ในชุด หากพบองค์ประกอบดังกล่าว เราสามารถพิมพ์แฝดสามซึ่งจะเป็นคู่ของจำนวนเต็มและค่าลบของผลรวมของพวกมัน

ความซับซ้อนของเวลา − O(n 2 )

ความซับซ้อนของอวกาศ − O(n)

ตัวอย่าง

public class Arrays{
   public List<List<int>> ThreeSum(int[] nums){
      List<List<int>> res = new List<List<int>>();
      if (nums == null || nums.Length == 0){
         return res;
      }
      var newnums = nums.OrderBy(x => x).ToArray();
      for (int i = 0; i < newnums.Count(); i++){
         int left = i + 1;
         int right = newnums.Count() - 1;
         while (left < right){
            int sum = newnums[i] + newnums[left] + newnums[right];
            if (sum == 0){
               List<int> l = new List<int>();
               l.Add(newnums[i]);
               l.Add(newnums[left]);
               l.Add(newnums[right]);
               res.Add(l);
               int leftValue = newnums[left];
               while (left < newnums.Length && leftValue == newnums[left]){
                left++;
               }
               int riightValue = newnums[right];
               while (right > left && riightValue == newnums[right]){
                  right--;
               }
            }
            else if (sum < 0){
               left++;
            }
            else{
               right--;
            }
         }
         while (i + 1 < newnums.Length && newnums[i] == newnums[i + 1]){
            i++;
         }
      }
      return res;
   }
}

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

ผลลัพธ์

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