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 前情回顾 昨晚的爬楼梯算法题,有位朋友提了个思路,使用动态规划算法.介于篇幅问题,这里不细说动态规划算法,以后会在数据机构和算法的理论知识里细说. 昨 ...
随机推荐
- PAT 输出华氏-摄氏温度转换表
输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper].且每次增加2华氏度的华氏-摄氏温度转换表. 温度转换的计算公式:C=5×(F−3 ...
- 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁
转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...
- SpringBoot快速开发REST服务最佳实践
一.为什么选择SpringBoot Spring Boot是由Pivotal团队提供的全新框架,被很多业内资深人士认为是可能改变游戏规则的新项目.早期我们搭建一个SSH或者Spring Web应用,需 ...
- 造轮子-Java泛型堆排
个人博客地址:http://kyle.org.cn/2018/03/13/heapsort/ Java实现泛型堆排算法,用于N个对象中选择最大或者最小的前M个,其中M<=N 类似于Mysql中o ...
- Matlab绘图基础——散点生成三角网(TIN)
%例一:二维三角网TIN模型的生成 X=rand(10,2)*5; dt=DelaunayTri(X(:,1),X(:,2)); %生成三角网 triplot(dt);hold on; ...
- 利用CSS3制作网页动画
如何在网页中实现动画效果动态图片 flashjavascriptcss3变形是一些效果的集合如平移 旋转 缩放 倾斜效果每个效果都可以称为变形(transfrom) 它们可以分别操控元素发生平移.旋转 ...
- 【Java实现】栈和队列就是这么简单
一.前言 上一篇已经讲过了链表[Java实现单向链表]了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够 ...
- Android 动画 属性动画 视图动画 补间动画 帧动画 详解 使用
Android动画 Property Animation res/animator/filename.xml In Java: R.animator.filename In XML: @[packag ...
- ibatis.net 入门demo 实现基本增删改查
1.项目架构体系 DAO(数据访问层) Domain(实体层) Text(表示层) 2.比较重要的是需要添加两个dll的引用,以及两个配置文件和一个XML文件 两个 IbatisNet.Com ...
- PTA的使用简介
PTA(Programming Teaching Assistant)是PAT(Programming Ability Test)的配套练习平台. 1.关于PAT PAT(Programming Ab ...