题目描述:
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [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
你可以按 任意顺序 返回答案 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/4sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
案例:
解决方案:
方案一:(通过测试,但超时)
代码:
public IList<IList<int>> FourSum(int[] nums, int target)
{
List<IList<int>> res = new List<IList<int>>();
if (nums == null || nums.Length < 4)
{
return (IList<IList<int>>)res;
}
Array.Sort(nums);
for (int i = 0; i < nums.Length - 3; i++)
{
for (int j = i + 1; j < nums.Length - 2; j++)
{
for (int z = j + 1; z < nums.Length - 1; z++)
{
for (int k = z + 1; k < nums.Length; k++)
{
if ((long)nums[i] + (long)nums[j] + (long)nums[z] + (long)nums[k] == (long)target)
{
var r = new List<int> { nums[i], nums[j], nums[z], nums[k] };
bool exists = true;
for (int g = 0; g < res.Count; g++)
{
if (res[g][0] == nums[i] && res[g][1] == nums[j] && res[g][2] == nums[z] && res[g][3] == nums[k])
{
exists = false;
break;
}
}
if (exists)
{
res.Add((IList<int>)r);
}
}
}
}
}
}
return (IList<IList<int>>)res;
}
提交结果:
方案二:
代码:
public IList<IList<int>> FourSum(int[] nums, int target) {
List<IList<int>> res = new List<IList<int>>();
if (nums == null || nums.Length < 4)
{
return (IList<IList<int>>)res;
}
Array.Sort(nums);
for (int i = 0; i < nums.Length - 3; i++)
{
if (i > 0 && nums[i] == nums[i - 1])
{
continue;
}
if ((long)nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target)
{
break;
}
if ((long)nums[i] + nums[nums.Length - 3] + nums[nums.Length - 2] + nums[nums.Length - 1] < target)
{
continue;
}
for (int j = i + 1; j < nums.Length - 2; j++)
{
if (j > i + 1 && nums[j] == nums[j - 1])
{
continue;
}
if ((long)nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target)
{
break;
}
if ((long)nums[i] + nums[j] + nums[nums.Length - 2] + nums[nums.Length - 1] < target)
{
continue;
}
for (int z = j + 1; z < nums.Length - 1; z++)
{
if (z > j + 1 && nums[z] == nums[z - 1])
{
continue;
}
if ((long)nums[i] + nums[j] + nums[z] + nums[z + 1] > target)
{
break;
}
if ((long)nums[i] + nums[j] + nums[z] + nums[nums.Length - 1] < target)
{
continue;
}
for (int k = z + 1; k < nums.Length; k++)
{
if (k > z + 1 && nums[k] == nums[k - 1])
{
continue;
}
if ((long)nums[i] + nums[j] + nums[z] + nums[k] > target)
{
break;
}
if ((long)nums[i] + nums[j] + nums[z] + nums[k] < target)
{
continue;
}
if ((long)nums[i] + nums[j] + nums[z] + nums[k] == target)
{
var r = new List<int> { nums[i], nums[j], nums[z], nums[k] };
res.Add((IList<int>)r);
}
}
}
}
}
return (IList<IList<int>>)res;
}
提交结果: