Сложность: medium
Учитывая массив nums из n целых чисел, верните все уникальные четверки [nums[a], nums[b], nums[c], nums[d]], такие что:
- 0 <= a, b, c, d < n
- a, b, c и d различны
- nums[a] + nums[b] + nums[c] + nums[d] == target
Ответ можно вернуть в любом порядке.
Пример:
Input: nums = [1,0,-1,0,-2,2], target = 0 Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
👨💻 Алгоритм:
1⃣Отсортировать массив
nums.2⃣Использовать рекурсивную функцию
kSum, которая решает задачу обобщённо для любого k (в данном случае — k = 4), уменьшая её до задачи двух указателей (2Sum).3⃣Внутри
kSum, если k == 2, используем два указателя и ищем пары чисел с нужной суммой. Если k > 2, рекурсивно вызываем kSum для k - 1, сдвигая индекс и уменьшая целевую сумму.😎 Решение:
public class Solution {
int len = 0;
public List<List<Integer>> fourSum(int[] nums, int target) {
len = nums.length;
Arrays.sort(nums);
return kSum(nums, target, 4, 0);
}
private ArrayList<List<Integer>> kSum(int[] nums, int target, int k, int index) {
ArrayList<List<Integer>> res = new ArrayList<>();
if (index >= len) {
return res;
}
if (k == 2) {
int i = index, j = len - 1;
while (i < j) {
if (target - nums[i] == nums[j]) {
List<Integer> temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(target - nums[i]);
res.add(temp);
while (i < j && nums[i] == nums[i + 1]) i++;
while (i < j && nums[j - 1] == nums[j]) j--;
i++;
j--;
} else if (target - nums[i] > nums[j]) {
i++;
} else {
j--;
}
}
} else {
for (int i = index; i < len - k + 1; i++) {
ArrayList<List<Integer>> temp = kSum(nums, target - nums[i], k - 1, i + 1);
if (temp != null) {
for (List<Integer> t : temp) {
t.add(0, nums[i]);
}
res.addAll(temp);
}
while (i < len - 1 && nums[i] == nums[i + 1]) {
i++;
}
}
}
return res;
}
}Ставь 👍 и забирай 📚 Базу знаний