รูปแบบตัวชี้สองตัวและคล้ายกับสี่เท่า Sum ถึง Zero เราสามารถทำตามแนวทางเดียวกันนี้เพื่อวนซ้ำผ่านอาร์เรย์ โดยนำตัวเลขมาทีละตัว ในทุกขั้นตอน เราจะบันทึกความแตกต่างระหว่างสี่เท่าและหมายเลขเป้าหมาย และในแต่ละขั้นตอน เราจะเปรียบเทียบกับความแตกต่างของเป้าหมายขั้นต่ำจนถึงตอนนี้ เพื่อที่ในท้ายที่สุด เราสามารถคืนค่าแฝดสามด้วยผลรวมที่ใกล้เคียงที่สุด
ความซับซ้อนของเวลา
การเรียงลำดับอาร์เรย์จะใช้ O(N* logN) โดยรวม fourSumClosest() จะใช้ O(N * logN + N^3) ซึ่งเทียบเท่ากับ O(N^3) แบบไม่แสดงอาการ
ความซับซ้อนของอวกาศ
ความซับซ้อนของช่องว่างของอัลกอริธึมข้างต้นจะเป็น O(N) ซึ่งจำเป็นสำหรับการเรียงลำดับ
ตัวอย่าง
public class Arrays{ public int FourSumClosestToTarget(int[] nums, int target){ if (nums == null || nums.Length == 0){ return -1; } int[] newNums = nums.OrderBy(x => x).ToArray(); int initialSum = newNums[0] + newNums[1] + newNums[2] + newNums[3]; for (int i = 0; i < nums.Length; i++){ for (int j = i; j < nums.Length; j++){ int left = j + 1; int right = nums.Length - 1; while (left < right){ int nearestSum = newNums[i] + newNums[j] + newNums[left] + newNums[right]; if (nearestSum < initialSum){ initialSum = nearestSum; } if (nearestSum == target){ return nearestSum; } else if (nearestSum < target){ left++; } else{ right--; } } } } return initialSum; } } static void Main(string[] args){ Arrays s = new Arrays(); int[] nums = { 1,0,-1,0,-2,2 }; var ss = FourSumClosestToTarget(nums,0); Console.WriteLine(ss); }
ผลลัพธ์
0