双指针之两数之和,三数之和,N数之和系列
两数之和
暴力法,时间复杂度O(n*n),空间复杂度O(1)
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""for i in range(len(nums)):for j in range(i+1, len(nums)):if nums[i] + nums[j] == target:return [i, j]
hashmap,时间复杂度O(n),空间复杂度O(n)
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""hashmap = {}for index, num in enumerate(nums):res = target - numif res in hashmap:return [hashmap[res], index]hashmap[num] = index
二分查找,先排序,后双指针,排序时间复杂度为O(nlog(n)),双指针时间复杂度为O(n)
所以,总的时间复杂度为O(nlog(n))
该方法返回的是对应的数字,而不是数字索引,要想知道索引,需要保存原数组进行二次查找。
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:nums = sorted(nums)n = len(nums)left = 0right = n - 1while left < right:s = nums[left] + nums[right]if s == target:return [nums[left], nums[right])]elif s < target:left += 1elif s > target:right -= 1
如果数组有重复数,并且存在多对数字和为target,代码如下
def twoSum(nums, target):nums.sort()n = len(nums)left = 0right = n - 1res = []while left < right:s = nums[left] + nums[right]lo = nums[left], hi = nums[right]if s < target:while left < right and nums[left] == lo:left += 1elif s > target:while left < right and nums[right] == hi:right -= 1else:res.append([lo, hi])while left < right and nums[left] == lo:left += 1while left < right and nums[right] == hi:right -= 1return res
三数之和
外层for循环遍历每一个数,内层变为求两数之和为target-nums[i]
排序时间复杂度为O(nlog(n)),外层for循环复杂度为O(n),双指针时间复杂度为O(n)
时间复杂度O(nlog(n) + nn)=O(nn)
注意跳过重复数
def threeSum(nums, target):nums.sort()n = len(nums)res = []i = 0while i < n:tuples = twoSum(nums, i + 1, target - nums[i])if not tuples:i += 1continuefor t in tuples:res.append(t)i += 1while i < n and nums[i] == nums[i - 1]:i += 1return res
def twoSum(nums, start, target):left = startright = len(nums) - 1res = []while left < right:...(两数之和代码)return res
四数之和
外层for循环遍历每一个数,内层变为求三数之和为target-nums[i]
请读者自行发挥。
N数之和
def nSum(nums, n, start, target):size = len(nums)res = []# 至少是2 sum, 并且数组大小不应该小于nif n < 2 or size < n:return resif n == 2:left = startright = size - 1while left < right:s = nums[left] + nums[right]lo = nums[left]hi = nums[right]if s < target:while left < right and nums[left] == lo:left += 1elif s > target:while left < right and nums[right] == hi:right -= 1else:res.append([lo, hi])while left < right and nums[left] == lo:left += 1while left < right and nums[right] == hi:right -= 1else:# n > 2时,递归计算(n-1)sum的结果i = startwhile i < size:sub = nSum(nums, n - 1, i + 1, target - nums[i])# (n - 1) sum + nums[i]就是n sumfor arr in sub:arr.append(nums[i])res.append(arr)i += 1while i < size and nums[i] = nums[i - 1]:i += 1return res
双指针之两数之和,三数之和,N数之和系列相关推荐
- 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...
- 我理解的算法 - 三数之和及两数、三数之和扩展题
我理解的算法 - 三数之和及两数.三数之和扩展题 LeetCode 15.三数之和 扩展 三数之和变种题 两数之和变种题 LeetCode 15.三数之和 这道题的题目大家自行查看:链接在这 ,题目和 ...
- LeetCode/LintCode 题解丨一周爆刷双指针: 两数之和
描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...
- 基础数学(二)两数之和 三数之和
目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返 ...
- Day 06 | 242.有效的字母异位词 349. 两个数组的交集 202.快乐数 1. 两数之和
这四道题之前都做过!比第一次顺利一些,不过还是得看题解,磕磕绊绊的.不过我相信坚持下去一定会越来越好滴! 242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 ...
- 算法训练Day6:有效的字母异位词, 两个数组的交集,快乐数,两数之和
文章目录 有效的字母异位词 自己题解 其他参考 两个数组的交集 题解(重点在熟悉set的一些操作以及使用场景) 快乐数 两数之和 题解(这道题还是比较难的) 有效的字母异位词 Category Dif ...
- 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数。
如果一个数等于它的因子之和,则称该数为"完数"(或"完全数").例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数".编程找出10 ...
- 软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
如果一个数恰好等于它的因子之和,则称该数为"完全数",又称完美数或完备数. 例如:第一个完全数是6,它有约数1.2.3.6,除去它本身6外,其余3个数相加, 1+2+3=6.第二个 ...
- 因数之和等于数字本身的数称为完全数,比数字本身大的数称为丰沛数, 比数字本身小的数称为不足数
1.因数之和等于数字本身的数称为完全数,比数字本身大的数称为丰沛数, 比数字本身小的数称为不足数. 编写程序,输出所有[100,10000)区间的所有完全数以及丰沛数和不足数的个数. 请在[pytho ...
- 【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
最新文章
- 算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难
- Cookie的生命周期问题
- 树莓派AI视觉云台——5.SSH文件传输
- Thinkpad F2不能进行重命名的问题
- 【 CodeForces - 864B】Polycarp and Letters(水题,字符串,有坑)
- mac bochs 调试linux,Mac OS X下编译安装带debugger的bochs
- Java实现分页功能 代码很粗糙,都是根据自己所需去定义逻辑功能的。
- 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...
- jQuery技巧总结(转)作为JQuery学习总结
- 正则表达式的几种字符判断(包括数字,字母组合等)
- day20: zip压缩工具及打包工具介绍
- POJ3080Blue Jeans
- h.265/HEVC 和 h.264/AVC 比较,在技术上的改进和优势
- 微信号注册人工服务器,两个方法让你一次性找到微信人工客服,简单而又粗暴!...
- CF1146G Zoning Restrictions 最小割
- AndroidStudio 模拟器一直黑屏或者处于离线状态
- 论文Makeup Like a Superstar: Deep Localized Makeup Transfer Network(2016,妆容迁移,基于数据库匹配)
- 神经网络(Neural Networks)
- FineReport之localhost拒绝了我们的连接请求
- Groovy(Java笨狗)系列---Getting Started(三)
热门文章
- 【T1T2】签到题集合
- 2018年网易实习生笔试题集合之安置路灯
- Ftp服务器架设与客户端使用--FileZilla
- main函数带有参数
- 搜索中的 Query 理解及应用
- android elevation translationz 简书,Android5.x中的阴影效果elevation和translationZ的实现方法...
- 大数据早报:搜狐《数字之道》,召唤新势力 十一数据观:钱和人都去哪了?(10.10)
- 按年份、季度、月份、日期查询SQL语句
- SECS/GEM300mm通讯协议概念
- 下肢静脉血栓——桂枝茯苓丸加四味健步汤