쉬운 접근 방식은 4개의 중첩 루프를 만들고 4개 요소의 합계가 0인지 여부를 하나씩 확인할 수 있다는 것입니다. 네 요소의 합이 0이면 요소를 인쇄합니다.
시간 복잡성 - O(n 4 )
공간 복잡성 - O(1)
정렬되지 않은 집합 데이터 구조를 사용하여 배열의 각 값을 저장할 수 있습니다. Set은 O(1) 시간에 요소를 검색하는 이점을 제공합니다. 따라서 배열의 각 쌍에 대해 집합에 존재할 수 있는 합계의 음수를 찾습니다. 그러한 요소가 발견되면 정수 쌍과 그 합계의 음수 값이 될 3중항을 인쇄할 수 있습니다.
시간 복잡성 - O(n 3 )
공간 복잡성 - 오(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]]