四数之和
解题思路:
思路和之前的三数之和一模一样,就是每次固定的指针多了一个,每次双指针循环完先移动这个再移动第一个指针。
代码:
public static IList<IList<int>> FourSum(int[] nums, int target)
{
IList<IList<int>> results = new List<IList<int>>();
if (nums.Length < 4)
return results;//先判断nums元素个数。
Array.Sort(nums);//排序。
int first = 0;//固定的第一个指针。
while(first<nums.Length-3)
{
int second = first + 1;//固定的第二个指针。
while(second<nums.Length-2)
{
int left = second + 1;//每次移动的左指针。
int right = nums.Length - 1;//每次移动的右指针。
while(left<right)
{
int lgx = nums[first] + nums[second] + nums[left] + nums[right];
if(lgx<target)
{
left++;
}
else if(lgx>target)
{
right--;
}//不等的情况只需要移动左右指针之一。
else
{
IList<int> result = new List<int>();//找到一组就新建一个链表,加进去。
result.Add(nums[first]);
result.Add(nums[second]);
result.Add(nums[left]);
result.Add(nums[right]);
results.Add(result);
while(left<right&&nums[left]==nums[left+1])
{
left++;
}
while(left<right&&nums[right-1]==nums[right])
{
right--;
}//每次跳过与之前相同的数,避免重复。
left++;
right--;
}//相等的情况要同时移动左右指针。还有避免重复。
}
while (second < nums.Length - 2 && nums[second] == nums[second + 1])
{
second++;
}//避免重复。
second++;
}
while (first < nums.Length - 2 && nums[first] == nums[first + 1])
{
first++;
}//避免重复。
first++;
}
return results;
}