两数之和

暴力法,时间复杂度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(n
log(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(n
log(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数之和系列相关推荐

  1. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)

    作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...

  2. 我理解的算法 - 三数之和及两数、三数之和扩展题

    我理解的算法 - 三数之和及两数.三数之和扩展题 LeetCode 15.三数之和 扩展 三数之和变种题 两数之和变种题 LeetCode 15.三数之和 这道题的题目大家自行查看:链接在这 ,题目和 ...

  3. LeetCode/LintCode 题解丨一周爆刷双指针: 两数之和

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...

  4. 基础数学(二)两数之和 三数之和

    目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返 ...

  5. Day 06 | 242.有效的字母异位词 349. 两个数组的交集 202.快乐数 1. 两数之和

    这四道题之前都做过!比第一次顺利一些,不过还是得看题解,磕磕绊绊的.不过我相信坚持下去一定会越来越好滴! 242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 ...

  6. 算法训练Day6:有效的字母异位词, 两个数组的交集,快乐数,两数之和

    文章目录 有效的字母异位词 自己题解 其他参考 两个数组的交集 题解(重点在熟悉set的一些操作以及使用场景) 快乐数 两数之和 题解(这道题还是比较难的) 有效的字母异位词 Category Dif ...

  7. 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数。

    如果一个数等于它的因子之和,则称该数为"完数"(或"完全数").例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数".编程找出10 ...

  8. 软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全

    如果一个数恰好等于它的因子之和,则称该数为"完全数",又称完美数或完备数. 例如:第一个完全数是6,它有约数1.2.3.6,除去它本身6外,其余3个数相加, 1+2+3=6.第二个 ...

  9. 因数之和等于数字本身的数称为完全数,比数字本身大的数称为丰沛数, 比数字本身小的数称为不足数

    1.因数之和等于数字本身的数称为完全数,比数字本身大的数称为丰沛数, 比数字本身小的数称为不足数. 编写程序,输出所有[100,10000)区间的所有完全数以及丰沛数和不足数的个数. 请在[pytho ...

  10. 【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

最新文章

  1. 算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难
  2. Cookie的生命周期问题
  3. 树莓派AI视觉云台——5.SSH文件传输
  4. Thinkpad F2不能进行重命名的问题
  5. 【 CodeForces - 864B】Polycarp and Letters(水题,字符串,有坑)
  6. mac bochs 调试linux,Mac OS X下编译安装带debugger的bochs
  7. Java实现分页功能 代码很粗糙,都是根据自己所需去定义逻辑功能的。
  8. 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...
  9. jQuery技巧总结(转)作为JQuery学习总结
  10. 正则表达式的几种字符判断(包括数字,字母组合等)
  11. day20: zip压缩工具及打包工具介绍
  12. POJ3080Blue Jeans
  13. h.265/HEVC 和 h.264/AVC 比较,在技术上的改进和优势
  14. 微信号注册人工服务器,两个方法让你一次性找到微信人工客服,简单而又粗暴!...
  15. CF1146G Zoning Restrictions 最小割
  16. AndroidStudio 模拟器一直黑屏或者处于离线状态
  17. 论文Makeup Like a Superstar: Deep Localized Makeup Transfer Network(2016,妆容迁移,基于数据库匹配)
  18. 神经网络(Neural Networks)
  19. FineReport之localhost拒绝了我们的连接请求
  20. Groovy(Java笨狗)系列---Getting Started(三)

热门文章

  1. 【T1T2】签到题集合
  2. 2018年网易实习生笔试题集合之安置路灯
  3. Ftp服务器架设与客户端使用--FileZilla
  4. main函数带有参数
  5. 搜索中的 Query 理解及应用
  6. android elevation translationz 简书,Android5.x中的阴影效果elevation和translationZ的实现方法...
  7. 大数据早报:搜狐《数字之道》,召唤新势力 十一数据观:钱和人都去哪了?(10.10)
  8. 按年份、季度、月份、日期查询SQL语句
  9. SECS/GEM300mm通讯协议概念
  10. 下肢静脉血栓——桂枝茯苓丸加四味健步汤