题目描述
解题
思路:
①与之前三数之和类似的题目,多一位则多做一步循环;
②双指针法,for循环中采用首尾两位循环,在三数之和基数上在尾端添加新一位;
③首位for循环,四数为首(i),首+1(L),尾巴(RR),尾-1(RL),比较和与target的大小,改变L与RL位置,完成后当前I与RR的所有组合后,先改变RR位置,再次循环L与RL;知道当前i的所有组合遍历完成,改变i的值再次遍历。
public class Solution {
public IList<IList<int>> FourSum(int[] nums, int target) {
IList<IList<int>> results = new List<IList<int>>();
Array.Sort(nums);
if (nums.Count() < 4) { return results; }
for (int i = 0; i < nums.Length - 3 ; i++)
{
if (i > 0 && nums[i] == nums[i - 1]) continue;
int L = i + 1;
int RR = nums.Length - 1;
int RL = RR - 1;
int sum = 0;
while (L < RL)
{
while (L < RL)
{
sum = nums[i] + nums[L] + nums[RL] + nums[RR];
if (sum == target)
{
results.Add(new List<int> { nums[i], nums[L], nums[RL], nums[RR] });
while (L < RL && nums[RL] == nums[RL - 1]) RL--;
while (L < RL && nums[L] == nums[L + 1]) L++;
RL--;
L++;
}
else
{
if (sum > target) RL--;
else L++;
}
}
while (L < RR && nums[RR] == nums[RR - 1]) RR--;
RR--;
RL = RR - 1;
L = i + 1;
}
}
return results;
}
}