LeetCode题目之腾讯精选练习(50题):三数之和

墨蓝 2024-04-17 20:43 163阅读 0赞

题目

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

  1. 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
  2. 满足要求的三元组集合为:
  3. [
  4. [-1, 0, 1],
  5. [-1, -1, 2]
  6. ]

算法实现

  1. public static IList<IList<int>> ThreeSum(int[] nums)
  2. {
  3. IList<IList<int>> list = new List<IList<int>>();
  4. if (nums.Length == 0)
  5. return list;
  6. Array.Sort(nums);
  7. int length = nums.Length;
  8. int first, last, sum;
  9. if (nums[0] <= 0 && nums[length - 1] >= 0)
  10. {
  11. for (int i = 0; i < length - 2; )
  12. {
  13. if (nums[i] > 0) break;
  14. first = i + 1;
  15. last = length - 1;
  16. do
  17. {
  18. if (first >= last || (double)nums[i] * nums[last] > 0 ) break;//注意乘法溢出
  19. sum = nums[first] + nums[i] + nums[last];
  20. if (sum == 0)
  21. list.Add(new List<int>() {
  22. nums[i], nums[first], nums[last] });
  23. if (sum <= 0 )
  24. {
  25. while (first < last && nums[first] == nums[++first]) ;
  26. }
  27. else
  28. {
  29. while (first < last && nums[last] == nums[--last]) ;
  30. }
  31. } while (first < last);
  32. do
  33. {
  34. if (i + 1 >= length - 2)
  35. break;
  36. }
  37. while (nums[i] == nums[++i]);
  38. if (i + 1 >= length - 2)
  39. break;
  40. }
  41. }
  42. return list;
  43. }

执行结果

执行结果 : 通过
执行用时 : 472 ms, 在所有 C# 提交中击败了78.01%的用户
内存消耗 : 34.3 MB, 在所有 C# 提交中击败了32.10%的用户
在这里插入图片描述

小的总结

本次题目较难,自己设计算法时没有解答出来,后来借鉴了题解的第一个——双指针,在移植到c#过程中发现一些bug:
1、三人同符号的判断存在乘法溢出问题
2、++i问题存在数组越界问题
之后经行了一些改进,成功完成了。

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读