รูปแบบตัวชี้สองตัวและคล้ายกับสี่เท่า 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