本文讲述了Array类中第15个问题的几种解法,实现语言包括C,Python, 难度为medium

问题:

Given an array nums of n integers, are there elements abc in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],A solution set is:
[[-1, 0, 1],[-1, -1, 2]
]

给定 n 个整数的数组数, 是否有元素 a, b, c 在数字中, 这样一个 a + b + c = 0?查找数组中满足条件且不重复的三元组。

注意:

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

例如:

给定数组nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

[ [-1, 0, 1], [-1, -1, 2] ]

1. C语言--将3Sum问题转化为2Sum问题(O(n^2))

本题是找出满足要求的三元组,值得注意的是答案中不可以包含重复的三元组。本题的解法是先确定一个元素,然后以该元素的相反数为目标,对余下的元素进行2Sum求解(对撞指针法,详见之前的博客)。由于本题中的不可重复要求,所以要先进行排序,在进行重复三元组的剔除。

static int compare(const void *a, const void *b)
{return *(int *) a - *(int *) b;
}static void two_sum(int *nums, int low, int high, int target, int **results, int *count)
{while (low < high) {int diff = target - nums[low];if (diff > nums[high]) {while (++low < high && nums[low] == nums[low - 1]) {}} else if (diff < nums[high]) {while (--high > low && nums[high] == nums[high + 1]) {}} else {results[*count] = malloc(3 * sizeof(int));results[*count][0] = -target;results[*count][1] = nums[low];results[*count][2] = nums[high];(*count)++;while (++low < high && nums[low] == nums[low - 1]) {}while (--high > low && nums[high] == nums[high + 1]) {}}}
}/**** Return an array of arrays of size *returnSize.** Note: The returned array must be malloced, assume caller calls free().**/
static int** threeSum(int* nums, int numsSize, int* returnSize)
{if (numsSize < 3) {return NULL;    }qsort(nums, numsSize, sizeof(*nums), compare);*returnSize = 0;int i, j, capacity = 50000;int **results = malloc(capacity * sizeof(int *));for (i = 0; i < numsSize; i++) {if (i == 0 || i > 0 && nums[i] != nums[i - 1]) {two_sum(nums, i + 1, numsSize - 1, -nums[i], results, returnSize);}}return results;
}

运行结果为:

2. python--将3Sum问题转化为2Sum问题(O(n^2))

python的结题思路和C语言是一样的,只是得益于python的库,其程序比较简单。

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:""":type nums: List[int]:rtype: List[List[int]]"""res = []nums.sort()for i in range(0, len(nums)):if i > 0 and nums[i] == nums[i - 1]:continuetarget = 0 - nums[i]start, end = i + 1, len(nums) - 1while start < end:if nums[start] + nums[end] > target:end -= 1  elif nums[start] + nums[end] < target:start += 1else:res.append((nums[i], nums[start], nums[end]))end -= 1start += 1while start < end and nums[end] == nums[end + 1]:end -= 1while start < end and nums[start] == nums[start - 1]:start += 1return res

运行结果为:

虽然python占用内存少,但是运行时间太长。

15. 3 Sum (C,Python)相关推荐

  1. 2017 年最流行的 15 个数据科学 Python 库

    转自http://www.codeceo.com/article/15-data-science-python-libraries.html 2017 年最流行的 15 个数据科学 Python 库 ...

  2. [云炬python学习笔记]Numpy中内置函数min(),max(),sum()与Python中内置函数min(),max(),sum()性能对比分析

    众所周知,Python有许多内置函数(例如min(),max(),sum()),Numpy也有自己的内置函数(np.min(),np.max(),np.sum()).由于Numpy的函数是在编译码中执 ...

  3. 2017年最流行的15个数据科学Python库

    选自Medium 作者:Igor Bobriakov 机器之心编译 参与:朱朝阳.吴攀 Python 近几年在数据科学行业获得了人们的极大青睐,各种资源也层出不穷.数据科学解决方案公司 ActiveW ...

  4. python 实数如何取整_从面试官角度提问:15道硬核Python面试题,论面霸是如何炼成的...

    见过面试题也不少了,总之了一句话:面试前备好功课,面试中临危不乱,面试后谦虚有礼!这只是我本人总结的一些面试三要素,需要的可以参考参考,话不多了,今天为大家找了比较硬核的15道面试题,希望能够对各位有 ...

  5. Python sum函数- Python零基础入门教程

    目录 一.Python sum 函数介绍 二.Python sum 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一. ...

  6. 15个优雅的Python编程技巧,掌握后瞬间玩转Python

    学Python朋友们应该都喜欢整洁.一目了然的代码.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:reque ...

  7. Hacker News 8 月招聘趋势榜:React 连续 15 月登顶,Python 卫冕编程语言

    Hacker News 近日发布了 2018 年 8 月招聘趋势榜. React 连续第 15 个月蝉联榜首 8 月份的招聘趋势榜中,前五名与 7 月份完全相同. 通过分析"who is h ...

  8. 15 个常用的python 开源框架

    注册登录 shaomine 博客园   首页   新随笔   联系   订阅 正在上传-重新上传取消​  管理 随笔 - 579  文章 - 1  评论 - 69  阅读 - 253万 15个最受欢迎 ...

  9. sum函数python后面很多小数_解决Numpy中sum函数求和结果维度的问题

    使用Numpy(下面简称np)中的sum函数对某一维度求和时,由于该维度会在求和后变成一个数,所以所得结果的这一维度为空. 比如下面的例子: a = np.array([[1,2,3],[4,5,6] ...

最新文章

  1. 基于OpenCV的表格文本内容提取
  2. 看完让你彻底搞懂Websocket原理
  3. log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
  4. STM32 之十四 System Memory、Bootloader
  5. 从原理到实践手动拼凑一个Linux系统
  6. 51单片机计算机实物焊接,基于51单片机的最小系统焊接图 浅谈单片机最小系统...
  7. implements OnClickListener
  8. 程序员如何抓住工业互联网风口实现逆袭?
  9. Oracle如何使用PL/SQL调试存储过程
  10. 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性
  11. 前端调用接口报错看不到报错响应时 console.dir
  12. 邮件系统被退回的原因及解决办法
  13. Datablau产品之Kubernetes(K8S)部署
  14. 双击启动PS软件界面不显示、PS无法打开,解决方法
  15. 利用Python做一个漂亮小姐姐词云跳舞视频
  16. Android第三方开发包值高德地图SDK使用介绍,android面试基础
  17. 在单片机C语言中const是什么意思
  18. IMAU 软件项目管理 期末复习总结 第六章
  19. AD21下 Gerber文件的理解和导出
  20. [Excel] excel随机填充内容/文本/数字

热门文章

  1. Eclipse 皮肤
  2. redis smembersmap_redis 基本指令以及数据类型
  3. kali2020设置root用户登录
  4. Kali Linux学习入门-更换源及强制更新
  5. ajax兼容低版本浏览器
  6. MySQL 字符串转in/double类型——CAST/CONVERT函数的用法
  7. (python)查看糗事百科文字 点赞 作者 等级 评论
  8. python基础--局部变量与全局变量
  9. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)
  10. JS实时检测文本框内容长度