我想检查一个数组,如果它的三个值之和为0.一个条件是不允许三元组(0,0,0)
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
for (int i = 0; i < num.Length; i++)
{
for (int j = 0; j < num.Length; j++)
{
for (int k = 0; k < num.Length; k++)
{
if (num[i] + num[j] + num[k] == 0 && num[i] <= num[j] && num[j] <= num[k] && (num[i] !=0 && num[j]!= 0 && num[k]!= 0))
{
List<int> listInt = new List<int>();
listInt.Add(num[i]);
listInt.Add(num[j]);
listInt.Add(num[k]);
if (!returnList.Contains(listInt))
{
returnList.Add(listInt);
}
}
}
}
}
return returnList;
}
这是我与if (num[i] + num[j] + num[k] == 0 && num[i] <= num[j] && num[j] <= num[k] && (num[i] !=0 && num[j]!= 0 && num[k]!= 0))
所以我尝试了第二个括号:(num[i] !=0 && num[j]!= 0 && num[k]!= 0)
以确保所有这些条件一次都是真的。你可能知道这不适合我。结果中不允许每个零,但它应该只能防止三重零。
一个解决方案是:(-1,0,1)但我不会得到它,因为我的条件不接受零。
链接到问题(如果感兴趣):https://leetcode.com/problems/3sum/
答案 0 :(得分:1)
你不应该试图检查它们是否都不等于零,而是检查它们中是否至少有一个不等于零。
所以而不是
(num[i] !=0 && num[j]!= 0 && num[k]!= 0)
执行此检查:
&& (num[i] !=0 || num[j]!= 0 || num[k]!= 0)
答案 1 :(得分:0)
更改
&& (num[i] !=0 && num[j]!= 0 && num[k]!= 0)
为:
&& !(num[i] == 0 && num[j] == 0 && num[k] == 0)
答案 2 :(得分:0)
你以前的情况是假的;它意味着i,j和k 必须全部与0不同。!(i == 0 || j == 0 || k == 0)
是您想要做的。
我会这样做:
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
foreach (int i in num)
{
foreach (int j in num)
{
foreach (int k in num)
{
if (i + j + k == 0 && i <= j && j <= k && !(i == 0 || j == 0 || k == 0))
{
returnList.Add(new List<int> { i, j, k });
}
}
}
}
return returnList;
}
如果你有点受虐狂,可以这样:
public static List<List<int>> ThreeSum(int[] num)
{
List<List<int>> returnList = new List<List<int>>();
foreach (List<int> listInt in num.SelectMany(i => num.SelectMany(j => num.Where(k => i + j + k == 0 && i <= j && j <= k && !(i == 0 || j == 0 || k == 0)).Select(k => new List<int> {i, j, k}).Where(listInt => !returnList.Contains(listInt)))))
{
returnList.Add(listInt);
}
return returnList;
}
顺便说一句,检查returnList是否包含新列表是没用的,因为它总是假的。 (请参阅编辑第一个代码,第二个代码无法更新。)