经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
三数之和的golang实现
来源:cnblogs  作者:timliudream  时间:2018/12/17 9:45:05  对本文有异议

给定一个包含 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. ]
我们来看一下图:

我们先对数组排序,得到如下图的结果

 

我们要计算a+b+c=0,先对数组循环得到a,然后b就是a的索引+1的值,c是len(nums)-1的值。

 

如果a+b+c<0的是时候,说明太小了,那b就往右挪一下

反之,如果a+b+c>0,那么说明太大了,c就往左挪一下

核心代码:
  1. func threeSum2(nums []int) [][]int {
  2. //先对数组排序
  3. sort.Ints(nums)
  4. result := [][]int{}
  5. for i := 0; i < len(nums)-1; i++ {
  6. if i > 0 && nums[i] == nums[i-1] {
  7. continue
  8. }
  9. j := i + 1
  10. z := len(nums) - 1
  11. for z > j {
  12. b := nums[j]
  13. c := nums[z]
  14. if nums[i]+b+c > 0 {
  15. z--
  16. } else if nums[i]+b+c < 0 {
  17. j++
  18. } else {
  19. item := []int{nums[i], b, c}
  20. result = append(result, item)
  21. for j < z && nums[j] == nums[j+1] {
  22. j++
  23. }
  24. for j < z && nums[z] == nums[z-1] {
  25. z--
  26. }
  27. j++
  28. z--
  29. }
  30. }
  31. }
  32. return result
  33. }

去重技巧:

  • 在循环一开始的时候,就判断当前位的值是否跟上一位一样,一样的话就跳过
  • 在把符合条件的值存进数组的时候,判断b的下一位是不是和b一样,判断c的下一位是不是和c一样,一样的话那就直接跳过
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号