15. 3 Sum (C,Python)
本文讲述了Array类中第15个问题的几种解法,实现语言包括C,Python, 难度为medium。
问题:
Given an array nums
of n integers, are there elements a, b, c 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)相关推荐
- 2017 年最流行的 15 个数据科学 Python 库
转自http://www.codeceo.com/article/15-data-science-python-libraries.html 2017 年最流行的 15 个数据科学 Python 库 ...
- [云炬python学习笔记]Numpy中内置函数min(),max(),sum()与Python中内置函数min(),max(),sum()性能对比分析
众所周知,Python有许多内置函数(例如min(),max(),sum()),Numpy也有自己的内置函数(np.min(),np.max(),np.sum()).由于Numpy的函数是在编译码中执 ...
- 2017年最流行的15个数据科学Python库
选自Medium 作者:Igor Bobriakov 机器之心编译 参与:朱朝阳.吴攀 Python 近几年在数据科学行业获得了人们的极大青睐,各种资源也层出不穷.数据科学解决方案公司 ActiveW ...
- python 实数如何取整_从面试官角度提问:15道硬核Python面试题,论面霸是如何炼成的...
见过面试题也不少了,总之了一句话:面试前备好功课,面试中临危不乱,面试后谦虚有礼!这只是我本人总结的一些面试三要素,需要的可以参考参考,话不多了,今天为大家找了比较硬核的15道面试题,希望能够对各位有 ...
- Python sum函数- Python零基础入门教程
目录 一.Python sum 函数介绍 二.Python sum 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一. ...
- 15个优雅的Python编程技巧,掌握后瞬间玩转Python
学Python朋友们应该都喜欢整洁.一目了然的代码.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:reque ...
- Hacker News 8 月招聘趋势榜:React 连续 15 月登顶,Python 卫冕编程语言
Hacker News 近日发布了 2018 年 8 月招聘趋势榜. React 连续第 15 个月蝉联榜首 8 月份的招聘趋势榜中,前五名与 7 月份完全相同. 通过分析"who is h ...
- 15 个常用的python 开源框架
注册登录 shaomine 博客园 首页 新随笔 联系 订阅 正在上传-重新上传取消 管理 随笔 - 579 文章 - 1 评论 - 69 阅读 - 253万 15个最受欢迎 ...
- sum函数python后面很多小数_解决Numpy中sum函数求和结果维度的问题
使用Numpy(下面简称np)中的sum函数对某一维度求和时,由于该维度会在求和后变成一个数,所以所得结果的这一维度为空. 比如下面的例子: a = np.array([[1,2,3],[4,5,6] ...
最新文章
- 基于OpenCV的表格文本内容提取
- 看完让你彻底搞懂Websocket原理
- log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
- STM32 之十四 System Memory、Bootloader
- 从原理到实践手动拼凑一个Linux系统
- 51单片机计算机实物焊接,基于51单片机的最小系统焊接图 浅谈单片机最小系统...
- implements OnClickListener
- 程序员如何抓住工业互联网风口实现逆袭?
- Oracle如何使用PL/SQL调试存储过程
- 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性
- 前端调用接口报错看不到报错响应时 console.dir
- 邮件系统被退回的原因及解决办法
- Datablau产品之Kubernetes(K8S)部署
- 双击启动PS软件界面不显示、PS无法打开,解决方法
- 利用Python做一个漂亮小姐姐词云跳舞视频
- Android第三方开发包值高德地图SDK使用介绍,android面试基础
- 在单片机C语言中const是什么意思
- IMAU 软件项目管理 期末复习总结 第六章
- AD21下 Gerber文件的理解和导出
- [Excel] excel随机填充内容/文本/数字
热门文章
- Eclipse 皮肤
- redis smembersmap_redis 基本指令以及数据类型
- kali2020设置root用户登录
- Kali Linux学习入门-更换源及强制更新
- ajax兼容低版本浏览器
- MySQL 字符串转in/double类型——CAST/CONVERT函数的用法
- (python)查看糗事百科文字 点赞 作者 等级 评论
- python基础--局部变量与全局变量
- BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)
- JS实时检测文本框内容长度