热门标签 | 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



推荐阅读
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • Encountering frequent mismatches during Terraform apply operations, particularly with resource attributes. ... [详细]
  • 在使用Python 3.x的argparse模块时,如果输入参数中包含&符号,会遇到解析错误。本文介绍了如何解决这一问题,确保输入参数能够正确解析。 ... [详细]
  • 用示例链接 Java 中的 hashset ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文详细介绍了Java中HashSet的工作原理及其源码分析。HashSet实现了Set接口,内部通过HashMap来存储数据,不保证元素的迭代顺序,且允许null值的存在。文章不仅涵盖了HashSet的基本概念,还深入探讨了其内部实现细节。 ... [详细]
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
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社区 版权所有