leetcode算法: Find All Duplicates in an Array
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)就是第二次出现,我们把它追加到结果列表
返回 结果列表 为什么这样就行呢:
1 列表长度是n,并且没个元素都是 1到n之间的数,所以 任何一个元素i ,用 绝对值(i) - 1 作下标,不会越界
2 初始情况下,数组每个元素都是正数(1到n之间) , 我们遍历数组:
每当第一次拿到一个数i,把 A[绝对值(i)-1] 该为负数,(i这个数值第一次出现,响应位置上的数字一定是正数,我们把他改成了负数)
如果我们拿到一个数i,这个数值是第二次出现,我们在取 A[绝对值(i)-1] 的时候,之前我们就把他改为负数了,所以, 绝对值(i) 这个数,这一次取到 一定是重复的。
把这个重复的数放到结果列表里
3 为什么 我们把里面的数字 取相反数,不做其他标记呢? 因为里面数字取相反数 我们还能用绝对值找到原来的数。这里每一个数在我们做映射算法的时候,会依据这个数找到一个数组的位置,所以不能用其他标记。
我的python代码:
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
for i in nums:
if nums[abs(i)-1] > 0:
nums[abs(i)-1] *= -1
else :
res.append(abs(i))
return res if __name__ == '__main__':
s = Solution()
res = s.findDuplicates([4, 3, 2, 7, 8, 2, 3, 1])
print(res)
leetcode算法: Find All Duplicates in an Array的更多相关文章
- 【算法】LeetCode算法题-Remove Duplicates from Sorted Array
这是悦乐书的第149次更新,第151篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第8题(顺位题号是26).给定一个已经排序(由小到大)的整数数组(元素可以重复),计算其 ...
- 乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array
乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array 一.前言 我们这次的实验是去除重复的有序数组元素,有大体两种算法. 二.Remo ...
- 【一天一道LeetCode】#80. Remove Duplicates from Sorted Array II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...
- [Leetcode][Python]26: Remove Duplicates from Sorted Array
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 26: Remove Duplicates from Sorted Array ...
- LeetCode(26)题解:Remove Duplicates from Sorted Array
https://leetcode.com/problems/remove-duplicates-from-sorted-array/ Given a sorted array, remove the ...
- leetcode笔记:Remove Duplicates from Sorted Array II
一.题目描写叙述 二.解题技巧 这道题和Remove Duplicates from Sorted Array这道题是相似的.仅仅只是这里同意出现反复的数字而已,能够採用二分搜索的变种算法.仅仅只是增 ...
- LeetCode算法题-K-diff Pairs in an Array(Java实现)
这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...
- LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)
这是悦乐书的第233次更新,第246篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453).给定大小为n的非空整数数组,找到使所有数组元素相等所需的 ...
- LeetCode算法题-Two Sum II - Input array is sorted
这是悦乐书的第179次更新,第181篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第38题(顺位题号是167).给定已按升序排序的整数数组,找到两个数字,使它们相加到特定 ...
- LeetCode算法题-Remove Duplicates from Sorted List
这是悦乐书的第160次更新,第162篇原创 01 前情回顾 昨晚的爬楼梯算法题,有位朋友提了个思路,使用动态规划算法.介于篇幅问题,这里不细说动态规划算法,以后会在数据机构和算法的理论知识里细说. 昨 ...
随机推荐
- Java内存区域之程序计数器--《深入理解Java虚拟机》学习笔记及个人理解(一)
Java虚拟机程序计数器 在书上的P39页 程序计数器干嘛的? 有了它,字节码解释器才可以知道下一条要执行的字节码指令是哪个. 无论是取下一条指令还是分支.循环.跳转.中断.线程恢复,都需要这个程序计 ...
- 浅谈 JSON.stringify 方法
一.前言 最近项目中,遇到需要将对象转换成字符串进行传递,上次写过一篇文章关于json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值.当时主要是用在有时候处理字符串和 ...
- Java多线程:ThreadLocal
一.ThreadLocal基础知识 ThreadLocal是线程的一个本地化对象,或者说是局部变量.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的 ...
- [poj2406]Power Strings_hash
Power Strings poj-2406 题目大意:询问一个字符串最多几个相同且连续的字符串构成(Eg:abababab由4个构成,abcd由1个构成). 注释:字符串长度为n,$1\le n\l ...
- 动态规划(Dynamic programming) 走楼梯
来自:算法爱好者 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,要求用程序来求出一共有多少种走法? f(10) = f(9) + f(8) f(9) = f(8) + f ...
- 密码脱落 JAVA 蓝桥杯
密码脱落 X星球的考古学家发现了一批古代留下来的密码.这些密码是由A.B.C.D 四种植物的种子串成的序列.仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串).由于年代久远,其中许多 ...
- 移动前端的html5 head 头标签
DOCTYPE DOCTYPE(Document Type),该声明位于文档中最前面的位置,处于 html 标签之前,此标签告知浏览器文档使用哪种 HTML 或者 XHTML 规范. 使用 HTML5 ...
- 仿京东树形菜单插件hovertree
hovertree是一个仿京东的树形菜单jquery插件,暂时有银色和绿色两种. 官方网址:http://keleyi.com/jq/hovertree/欢迎下载使用 查看绿色效果:http://ke ...
- C语言博客作业—函数
一.PTA实验作业 题目1:使用函数输出水仙花数 1. 本题PTA提交列表 2. 设计思路 (1)首先定义函数narcissistic(number)判断number是否为水仙花数: (2)narc用 ...
- 201621123050 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...