两数之和

  • leetcode关于两数之和的题目有一个系列,两数之和–>两数之和(有序数列)
    –>三数之和–>四数之和,这些系列题目看着一个比一个复杂,但是都是基于一个结题思路-双指针。

两数之和-无序

  • 题目描述:
  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
    你可以按任意顺序返回答案。

  • 示例:
  • 输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

  • 解析:由于这是一个无序数列,而且是返回和为target对应数组元素的下标,因此,这里不用双指针,用一个哈希记录已经遍历过的值和索引,用一次遍历就可以完成算法,时间复杂度为O(n),因为新建了一个哈希表来存储遍历元素和对应索引,所以空间复杂度为O(n)
  • 代码如下:
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:"""在一个数组中找出和为target的两个数对应的数组下标>>>self.twoSum([2,3,4], 7)>>>[1,2]"""#记录数字对应的索引dn = {}for i, x in enumerate(nums):if target-x in dn.keys():return [dn[target-x], i]dn[x] = ireturn []

两数之和-有序

  • 题目描述:
  • 给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
    函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
    你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

  • 示例:
  • 输入:输入:numbers = [2,7,11,15], target = 9
    输出:[1,2]
    解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

  • 解析:由于这是一个有序数列,返回和为target对应数组元素的下标,因此,这里可以使用双指针从数组头尾同时相向移动,指针最多移动n-2次,因此时间复杂度为O(n),变量都是数值常量,因此空间复杂度为O(1)
  • 代码如下:
class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:"""非递减数列中返回和为target的两个数的索引下标>>>self.twoSum([2,7,11,15], 9)>>>[1, 2]"""start, end = 0, len(numbers)-1while start < end:if numbers[start] + numbers[end] == target:return [start+1, end+1]elif numbers[start] + numbers[end] > target:end -= 1else:start += 1return []

三数之和

  • 题目描述:
  • 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
    注意:答案中不可以包含重复的三元组。

  • 示例:
  • 输入:输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]

  • 解析:这是一个无序数组,但是返回的数组元素的值,因此,我们可以先对原数组进行排序,同样使用使用双指针从数组头尾同时相向移动,但是不同于有序数组的二数之和,这里需要先固定一个数,然后从头尾相向移动,比如数组长度为n,固定排序后数组的第k个数,设start=0, end=n-1,双指针向nums[k]相向移动,循环条件是start<k,end>k,那么满足三数之和的条件时候,返回[nums[start], nums[k],nums[end]]。算法需要对每一个元素进行遍历,然后在有序数组上进行二数之和的流程,因此时间复杂度n*(n-3),为O(n2),变量都是数值常量,因此空间复杂度为O(1)
  • 代码如下:
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:"""给定一个数组,找出所有三个元素和为0的组合>>>self.threeSum(nums_temp[start] + nums_temp[end] == target:)>>>[[-1,-1,2],[-1,0,1]]"""res = []if len(nums) < 3:return []nums.sort()for i in range(len(nums)):if i>1 and nums[i]==nums[i-2]:continue start, end = 0 , len(nums)-1target = -nums[i]while start<i and end>i:if nums[start] + nums[end] == target:if [nums[start], nums[i], nums[end]] not in res:res.append([nums[start], nums[i], nums[end]])start += 1end -= 1elif nums[start] + nums[end] > target:end -= 1else:start += 1      return res

四数之和

  • 题目描述:
  • 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
    0 <= a, b, c, d < n
    a、b、c 和 d 互不相同
    nums[a] + nums[b] + nums[c] + nums[d] == target
    你可以按 任意顺序 返回答案 。

  • 示例:
  • 输入:输入:nums = [1,0,-1,0,-2,2], target = 0
    输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

  • 解析:这是一个无序数组,但是返回的数组元素的值,因此,我们可以先对原数组进行排序,算法原理和三数之和一样,本质都是基于二数之和的双指针来进行优化。到四数之和就是固定一个数nums[k],然后调用三数之和的方法(传入的数组不含nums[k])寻找三数之和为target-nums[k]的三数组合,五数之和、六数之和都可以此类推,每多一个数,算法时间复杂度要嵌套一层,因此时间复杂度n*(n-1)*(n-3),为O(n3),算法过程中产生了一个长度为n-1的数组切片,因此空间复杂度为O(n)
  • 代码如下:
class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:"""给定一个数组,找出所有四个元素和为target的组合>>>self.fourSum([1,0,-1,0,-2,2], 0)>>>[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]"""res = []nums.sort()for i in range(len(nums)):temp = self.threeSum(nums[:i]+nums[i+1:], target-nums[i])if temp:for three in temp:three.append(nums[i])three.sort()if three not in res:res.append(three)return resdef threeSum(self, nums, target):"""给定一个数组,找出所有三个元素和为target的组合>>>self.threeSum([-1,0,1,2,-1,-4], 0)>>>[[-1,-1,2],[-1,0,1]]"""res = []nums.sort()for i in range(len(nums)):if i>1 and nums[i]==nums[i-2]:continue start, end = 0 , len(nums)-1target_1 = target-nums[i]while start<i and end>i:if nums[start] + nums[end] == target_1:if [nums[start], nums[i], nums[end]] not in res:res.append([nums[start], nums[i], nums[end]])start += 1end -= 1elif nums[start] + nums[end] > target_1:end -= 1else:start += 1      return res

leetcode刷题日记-两数之和系列相关推荐

  1. 学渣的刷题之旅 leetcode刷题 1.两数之和

    给定一个整数数组nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素 ...

  2. leetcode刷题之 两数之和

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例:11 给定 nums = [2, 7, 11, 15], targe ...

  3. LeetCode第一题:两数之和(Java)

    文章目录 前言 一.题目内容 二.解题过程 1. 解题思路 2. 解题代码 三.提交结果 总结 前言 坚持下去便可胜利.只要心还在,梦想还在,我们还可以坚持直至胜利.没有过不去的坎,只有害怕的心.莫害 ...

  4. leetCode刷题 2. 两数相加

    原题链接: leetcode-cn.com/problems/ad- 题目描述 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你 ...

  5. C#LeetCode刷题之#15-三数之和(3Sum)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3618 访问. 给定一个包含 n 个整数的 ...

  6. LeetCode简单题之两数之和

    题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组 ...

  7. C#LeetCode刷题之#167-两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3903 访问. 给定一个已按照升序排列 的有序数组,找到两个数使得 ...

  8. LeetCode简单题之两数之和 IV - 输入 BST

    题目 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 示例 1: 输入: root = [5,3,6,2,4,null, ...

  9. leetcode刷题:三数之和

    题目: 分析: 这是最容易想到的做法,但是有明显的问题,时间复杂度达到0(n3),并且没有去重. class Solution { public:vector<vector<int> ...

  10. leetcode刷题 15.三数之和

    分析: 1.特判,对于数组长度 nn,如果数组为 null 或者数组长度小于 33,返回 []. 2.对数组进行排序. 3.遍历排序后数组: 若 nums[i]>0:因为已经排序好,所以后面不可 ...

最新文章

  1. 原来你是这样子的OpenAI!来看看它背后那些有趣的人和事
  2. 神级开源框架发布!Github排名前三,连Spring Cloud 都被干掉了!
  3. 正在使用.NET Framework 2.0 Beta 2的开发者要注意了!
  4. 数据回归分析和拟合的Matlab实现
  5. NYOJ 300 hdu 2276 Kiki Little Kiki 2 (矩阵快速幂)
  6. 使用 cglib_java动态代理(JDK和CGLIB原理解析与使用)
  7. (WebKit) ViewPort + Backing Store + Page Content
  8. 腾讯微博发表带图片的微博
  9. python支持按指定字符串分割成数组_python – 如何切割numpy数组字符串的每个元素?...
  10. mysql用户权限重置_mysql中重置密码与新用户权限分配的方法介绍
  11. 苹果鼠标怎么充电_双十一苹果无线充电宝怎么选?充电兼容性强的品牌推荐_...
  12. java hibernate的使用_java – 使用hibernate / JPA登录
  13. t检验自由度的意义_t检验的原理是什么?有什么意义?谢谢
  14. IDea更改主题和部分修改主题方法
  15. 什么编程语言的开发者平均年薪高达94万?
  16. 江城子 . 程序员之歌
  17. 问题 J: Frosting on the Cake
  18. 从-Quora-的-187-个问题中学习机器学习和NLP
  19. 信号电缆与计算机电缆区别,控制电缆与计算机电缆有什么区别
  20. 用友U8案例教程总账前台操作

热门文章

  1. (一)CentOS Docker 安装
  2. 谁设计python_如果你有设计师朋友,请对TA好一些...
  3. (day 27 - 递归分治 )剑指 Offer 33. 二叉搜索树的后序遍历序列
  4. tomcat如何增大并发_高并发环境下如何优化Tomcat性能
  5. 1千条数据平均分配给15人_母狗一胎生下15只小狗,差点破纪录,1年后再相聚的场景让人泪目...
  6. python123词频统计之哈姆雷特_基于Yarn的Spark环境,统计哈姆雷特词频(1)-阿里云开发者社区...
  7. Navicat for MySQL 连接 Mysql 8.0.16 时报错1251- Client does not support.....的解决办法
  8. JavaScript:indexOf()方法
  9. c语言兔子序列答案,C语言经典题目——兔子生兔子(示例代码)
  10. 死于决斗的数学天才伽罗瓦-人生的有限域