热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetcode算法:FindAllDuplicatesinanArray

Givenanarrayofintegers,1≤a[i]≤n(nsizeofarray),someelementsappeartwiceandothersappearonce.F

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

Example:
Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]


这道题描述的是:
给我们一个 长度为n 的列表,里面全都是整数 并且满足每个整数都是1到n之间的数

我们要做的是: 找到里面出现两次的整数

要求我们 使用O(n) 的时间复杂度和 O(1)的空间复杂度


描述一下思想:
  这道题困扰了我很久,在网上查阅了一些代码,用了一些时间才搞懂。
  O(n) 的时间复杂度 只允许一次遍历,就找到出现2次的元素
  O(1) 的空间复杂度,我们不能开辟线性空间。
  
  参考了网上大神的代码,他的想法是,把原本给我们的数组,当作hash来做散列映射。具体的做法是这样:
  对一个数组 A = [X,X,X,X,X,X]
    从头开始遍历,对每个元素 i :
      如果 A[ 绝对值(i)-1 ] >0: 我们就让 A[ 绝对值(i)-1 ] = -A[ 绝对值(i)-1 ]
      如果 A[ 绝对值(i)-1 ] <0: 绝对值(i)就是第二次出现&#xff0c;我们把它追加到结果列表
    返回 结果列表

  为什么这样就行呢&#xff1a;
    1 列表长度是n&#xff0c;并且没个元素都是 1到n之间的数&#xff0c;所以 任何一个元素i &#xff0c;用 绝对值(i) - 1 作下标&#xff0c;不会越界
    2 初始情况下&#xff0c;数组每个元素都是正数(1到n之间) , 我们遍历数组&#xff1a;
      每当第一次拿到一个数i&#xff0c;把 A[绝对值(i)-1] 该为负数,(i这个数值第一次出现&#xff0c;响应位置上的数字一定是正数&#xff0c;我们把他改成了负数)
      如果我们拿到一个数i&#xff0c;这个数值是第二次出现&#xff0c;我们在取 A[绝对值(i)-1] 的时候&#xff0c;之前我们就把他改为负数了&#xff0c;所以&#xff0c; 绝对值(i) 这个数&#xff0c;这一次取到 一定是重复的。
        把这个重复的数放到结果列表里
    3 为什么 我们把里面的数字 取相反数&#xff0c;不做其他标记呢&#xff1f; 因为里面数字取相反数 我们还能用绝对值找到原来的数。这里每一个数在我们做映射算法的时候&#xff0c;会依据这个数找到一个数组的位置&#xff0c;所以不能用其他标记。
      



我的python代码&#xff1a;

1 class Solution(object):
2 def findDuplicates(self, nums):
3 """
4 :type nums: List[int]
5 :rtype: List[int]
6 """
7 res &#61; []
8 for i in nums:
9 if nums[abs(i)-1] > 0:
10 nums[abs(i)-1] *&#61; -1
11 else :
12 res.append(abs(i))
13 return res
14
15
16 if __name__ &#61;&#61; &#39;__main__&#39;:
17 s &#61; Solution()
18 res &#61; s.findDuplicates([4, 3, 2, 7, 8, 2, 3, 1])
19 print(res)

 

转:https://www.cnblogs.com/Lin-Yi/p/7905425.html



推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
author-avatar
灵绾绾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有