标签:last nums 三数 list 50 break length LeetCode first
题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
算法实现
public static IList<IList<int>> ThreeSum(int[] nums)
{
IList<IList<int>> list = new List<IList<int>>();
if (nums.Length == 0)
return list;
Array.Sort(nums);
int length = nums.Length;
int first, last, sum;
if (nums[0] <= 0 && nums[length - 1] >= 0)
{
for (int i = 0; i < length - 2; )
{
if (nums[i] > 0) break;
first = i + 1;
last = length - 1;
do
{
if (first >= last || (double)nums[i] * nums[last] > 0 ) break;//注意乘法溢出
sum = nums[first] + nums[i] + nums[last];
if (sum == 0)
list.Add(new List<int>() { nums[i], nums[first], nums[last] });
if (sum <= 0 )
{
while (first < last && nums[first] == nums[++first]) ;
}
else
{
while (first < last && nums[last] == nums[--last]) ;
}
} while (first < last);
do
{
if (i + 1 >= length - 2)
break;
}
while (nums[i] == nums[++i]);
if (i + 1 >= length - 2)
break;
}
}
return list;
}
执行结果
执行结果 : 通过
执行用时 : 472 ms, 在所有 C# 提交中击败了78.01%的用户
内存消耗 : 34.3 MB, 在所有 C# 提交中击败了32.10%的用户
小的总结
本次题目较难,自己设计算法时没有解答出来,后来借鉴了题解的第一个——双指针,在移植到c#过程中发现一些bug:
1、三人同符号的判断存在乘法溢出问题
2、++i问题存在数组越界问题
之后经行了一些改进,成功完成了。
标签:last,nums,三数,list,50,break,length,LeetCode,first 来源: https://blog.csdn.net/qq_45556599/article/details/100177321
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。