title: LeetCode 第 15 号问题:三数之和(中等)

date: '2020-5-23'

updated: '2020-5-25'

tags: [LeetCode]

题目:

# 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复
# 的三元组。
#
#  注意:答案中不可以包含重复的三元组。
#
#
#
#  示例:
#
#  给定数组 nums = [-1, 0, 1, 2, -1, -4],
#
# 满足要求的三元组集合为:
# [
#   [-1, 0, 1],
#   [-1, -1, 2]
# ]

题目解析

题目需要我们找出三个数且和为 0 ,那么除了三个数全是 0 的情况之外,肯定会有负数和正数,所以一开始可以先选择一个数,然后再去找另外两个数,这样只要找到两个数且和为第一个选择的数的相反数就行了。也就是说需要枚举 a 和 b ,将 c 的存入 map 即可。

需要注意的是返回的结果中,不能有有重复的结果。这样的代码时间复杂度是 O(n^2)。在这里可以先将原数组进行排序,然后再遍历排序后的数组,这样就可以使用双指针以线性时间复杂度来遍历所有满足题意的两个数组合。

动画描述

待更新

代码实现

方法一:暴力破解法:三层for循环

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res = []nums.sort()  # 对列表进行排序,方便后面的循环操作for i in range(len(nums) - 2): # 找出第一个数for j in range(i+1, len(nums) - 1):  # 第二个数for k in range(j + 1, len(nums)):  # 第三个数if nums[k] + nums[i] + nums[j] == 0 and [nums[i], nums[j], nums[k]] not in res:# 使用not in res 会加大时间复杂度res.append([nums[i],nums[j], nums[k]])return re

运行结果:

由于时间复杂度为O(n^4),所以运行超时。

方法二:指针+排序

解法分析:

1.双指针法铺垫:先将给定nums排序,复杂度为O(NlogN)O(NlogN)。

2.双指针法思路: 固定3 个指针中最左(最小)数字的指针 k,双指针 i,j 分设在数组索引 (k, len(nums))(k,len(nums)) 两端,通过双指针交替向中间移动,记录对于每个固定指针 k 的所有满足 -- nums[k] = nums[i] + nums[j] 的 i,j 组合:

  • 分三种情况进行讨论:

    • 1.num[k] > 0 时退出程序
    • 2.--num[k] < nums[i] + nums[j] 此时i往左移,即 i += 1
    • 3.--num[k] > nums[i] + nums[j] 此时i往左移,即 j -= 1
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:        nums.sort()#对数组进行排序res,k=[],0 #res用来返回新的列表for k in range(len(nums)-2):#由于第一个数只有是负数才能够正常进行if nums[k] > 0:break# 引入三个指针,将对k指针尽心讨论if k > 0 and num[k] == nums[k - 1]:  # 对k值是否相等进行讨论continuei, j = k+1, len(nums) - 1  # i,j 两个指针从下标为1和下标为last开始移动while i<j:s = nums[k] + nums[i] + nums[j]if s < 0:  #当s<0的话,说明此时的值还是太小,需要往大的数进行移动i +=1  # 在运行完成之后还要考虑i是不是在elif s > 0:j -= 1  # 同上else:res.append((nums[k],nums[i],nums[j]))#对新的列表进行更新# 解决上面的问题:出现多个i 和 j 怎么处理, 当while i<j and nums[i] == nums[i+1]:i+=1while i<j and nums[j] == nums[j-1]:j-=1i += 1;j -= 1return res

运行结果

复杂度分析:

  • 时间复杂度 O(N^2):其中固定指针k循环复杂度 O(N),双指针 i,j 复杂度 O(N)
  • 空间复杂度 O(1):指针使用常数大小的额外空间。

方法三:哈希表解法

待更新


title: LeetCode 第 283 号问题:零移动(简单)

date: '2020-5-24'

updated: '2020-5-25'

tags: [LeetCode]

题目:

# 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
#
#  示例:
#
#  输入: [0,1,0,3,12]
# 输出: [1,3,12,0,0]
#
#  说明:
#
#
#  必须在原数组上操作,不能拷贝额外的数组。
#  尽量减少操作次数。
#
#  Related Topics 数组 双指针

题目分析:

设定一个临时变量 k = 0,遍历数组 nums ,将非零元素移动到 nums[k]位 置,同时 k++,而后将[k,….nums.size()]中的元素置零。

方法一:暴力破解法

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""遍历 nums ,将 nums 中为0的使用append方法添加到列表后,再紧接着把0移出列表Do not return anything, modify nums in-place instead."""# 暴力破解法for i in nums[:]:if i == 0:nums.append(0)nums.remove(0)

时间复杂度分析:

由于使用for循环,所以时间复杂度为O(n)

方法二:指针法

解析方法:

1.首先定义两个指针分别为 i,j

2.使用在指针中常用的夹击法,一个i指针从下标为0的位置出发,j指针从下标为last进行移动

3.j指针是用来将数字0移动到last,并且i 和 j 的元素交换位置1就可以实现,在python中交换两个数的值是比较简单的。

动画描述:

#方法二:进行值的交换class Solution:def moveZeroes(self, nums: List[int]) -> None:i = 0j = len(nums)for i in range(len(nums)):if nums[i] != 0:nums[i],nums[j] = nums[j],nums[i]j -= 1

时间复杂度分析:时间复杂度为O(n),空间复杂度O(1)

总结:解决此类问题:一般采用双指针法和用栈进行维护

找出不是两个数组共有的元素_06.数组(练习篇)相关推荐

  1. 找出不是两个数组共有的元素

    题目 练习7-4 找出不是两个数组共有的元素 (20 分) 给定两个整型数组,本题要求找出不是两者共有的元素. 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整 ...

  2. pta 习题集 5-2 找出不是两个数组共有的元素 (5分)

    给定两个整型数组,本题要求找出不是两者共有的元素. 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数NN(≤20≤20),随后是NN个整数,其间以空格分隔. 输出格式: 在一行中按照数字 ...

  3. 找出不是两个数组共有的元素(学习去重复算法)

    描述 给定两个整型数组,本题要求找出不是两者共有的元素.‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬ ...

  4. (难得要死)找出不是两个数组共有的元素

    题目描述 定两个整型数组,本题要求找出不是两者共有的元素. 输入 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔. 输出 在一行中按照数字给出的顺序输出 ...

  5. 找出所有不是这两个数组共有的元素

    文章目录 引入 代码 运行测试 引入 找出不是两个数组共有的元素.输入一个正整数 n(1<n≤10),再输入 n 个整 数,存入第 1 个数组中:然后输入一个正整数 m(1<m<=1 ...

  6. 从数组中找出最大的两个数

    题目:从数组区间A[lo, hi]中找出最大的两个整数A[x1]和A[x2],要求元素比较的次数尽可能的少. 迭代版1: 如图所示,当整个扫描一遍数组A,找出最大的数x1后,再扫描一次数组剩下的除去x ...

  7. 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间. ...

  8. Java 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 示例 1: 输入: [2,2,1] 输出: 1示例 2: 输入: [4,1,2,1,2] 输出: ...

  9. python counter 出现次数最少的元素_[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法...

    问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...

最新文章

  1. SAP MM初阶之ERS功能展示
  2. Tomcat学习总结(2)——Tomcat使用详解
  3. c++构建工具之shell,configure,make,cmake,scons,xmake简析总结
  4. 二进制转换为八进制-栈方式实现
  5. 使用命名空间解决名字冲突
  6. php三表关联,详解Yii2 hasOne(), hasMany()实现三表关联的两种方法
  7. Latex应用和资源
  8. 阅读react-redux源码 - 一
  9. 通过系统进程查找sql语句
  10. Python从序列中选择k个不重复元素
  11. PHP无法使用file_get_contents或者curl_init()函数解决办法
  12. Android Sqite数据库 11
  13. 【英语学习工具】学习英语硬背硬记太难了, 在这里解说 LeHoCat 提供免费的 视频集 工具的使用方法, 看视频学英语的工具, 制作英语教学课件的工具, 帮助自学英语(详细图文)第2版
  14. 广播前置放大器的作用_IP网络广播前置放大器
  15. 网易2012校园招聘笔试题目
  16. ApacheCN 翻译/校对/笔记整理活动进度公告 2019.10.4
  17. 数据库的长连接和短链接
  18. Gym 101246(ACM ICPC 2010-2011, NEERC, Southern Subregional Contest Russia, Saratov)
  19. Android-常用基本控件
  20. 新赛季的中超和国安,荆棘中前行

热门文章

  1. 自学python能学成吗-没有任何编程基础可以直接学习python语言吗?学会后能够做什么?...
  2. python3下载-python3
  3. 零基础学python-零基础如何开始学习 Python?看完这篇从小白变大牛!
  4. python培训班靠谱吗-什么样的python培训机构靠谱?
  5. python快速入门教程-Python 开发 14 天快速入门
  6. python编程入门指南-Python编程初学者指南 PDF扫描版[87MB]
  7. python和java的区别-Python与Java的区别与优劣?
  8. python怎么读取中文文件-python: py2下 中文 的 文件读写 及 打印
  9. 将语音识别准确率提升40% 他是当下最受比尔·盖茨器重的中国人
  10. 语音识别下一步发展如何?哪些技术可以使用?哪些价值可以发掘?