第十七个算法-数组判断重复

给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。

你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]

由于数组元素具有1 ≤ a[i] ≤ n,这样的范围,那其实我们当每次经过一个元素时,给他加上n,
那些数值超过2n的元素索引+1,对应的就是我们的出现了两次的元素。

public List<Integer> findDuplicates(int[] nums) {
        List<Integer> list = new ArrayList<>();
        int n = nums.length;
        for(int i = 0; i < n; i++){
            int k = (nums[i] - 1) % n;
            nums[k] += n;
            if(nums[k]>2*n){
                list.add(k+1);
            }
        }
        return list;
    }

下面这个方法执行更快:

public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList<>();
        int[] counts = new int[nums.length + 1];
        for (int number : nums) {
            counts[number]++;
        }
        for (int i = 1; i < counts.length; i++) {
            if (counts[i] == 2)
                res.add(i);
        }
        return res;
    }

想法真奇妙。

原文地址:https://www.cnblogs.com/liutian1912/p/12514446.html

时间: 2024-08-15 01:41:02

第十七个算法-数组判断重复的相关文章

算法-数组中重复的数字

在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字,要求时间复杂度为O(n). 简单解法同数组索引的值和值作为索引的值作为比较交换: //原文地址:http://www.cnblogs.com/xiaofeixiang -(NSInteger)duplicate:(NSMutableArray *)array{ for (NSInteger i=0;i<[array count];

数组判断重复

testName () { let arrStr = JSON.stringify(this.proArrName) for (let i = 0; i < this.proArrName.length; i++) { if ((arrStr.match(new RegExp(this.proArrName[i], 'g')).length) > 1) { return true } } return false }

对象数组判断重复

judgeduplicatelianxiren(arr){ var s = new Set() arr.forEach(i => s.add(i.custPhone)) if(arr.length !== s.size) { return true }else{ return false } } 原文地址:https://www.cnblogs.com/lgp142332/p/9857770.html

数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数

问题描述: 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数. 算法一: 对数组a[n]进行冒泡排序,如果冒泡所得的最值和前一个最值相等,则该最值为重复的数. 分析: 该算法时间复杂度最坏的情况为O(n的2次方),在空间开销上只需要一个额外的交换空间. 如何将时间开销减小呢?下面给出另外一种算法 算法二: 给定另外一个数组b[n],将a[n]中的数作为数组b的索引,然后遍历b[n],如果未访问过,则标记:如果已经访问过,则该索引就为重复的数. 分析: 该算法时间复杂度能够达到最

数组去重复算法

1.遍历法 var ary=[1,23,12,12,1,12,32,1,1]; function noRepetition(ary){ // 1.创建新数组 var newAry=[]; // 2.遍历老数组,拿到每个值,看新数组有这个值吗,没有添加进去, for(var i=0;i<ary.length;i++){ var cur=ary[i]; if (newAry.indexOf(cur)==-1){ indexOf IE8以前不支持, newAry.push(cur) } } // 3.

查找数组中重复的数字

题目来源于<剑指Offer>中的面试题3:找出数组中重复的数字. // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, // 那么对应的输出是重复的数字2或者3. 解决方法有多种,包括数组排序,哈希表法,以及作者推荐的重排数组法.此处介绍自己的一个做法,以空间换时间,通过新建数组来实现快速查

后缀数组四&#183;重复旋律4

后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多曲子以后发现很多作品中的旋律有重复的部分. 我们把一段旋律称为(k,l)-重复的,如果它满足由一个长度为l的字符串重复了k次组成. 如旋律abaabaabaaba是(4,3)重复的,因为它由aba重复4次组成. 小Hi想知道一部作品中k最大的(k,l)-重复旋律. 解题方法提示 输入 一

去掉数组中重复的数字

冒泡排序语法: for (int i = 0; i < 数组长度 - 1; i++) { for (int j = 0; j < 数组长度 - i - 1; j++) { if (数组名[j] < 数组名[j + 1]) { int empty = 数组名[j]; 数组名[j] = 数组名[j + 1]; 数组名[j + 1] = empty; } } } 上面这个语法是降序排序,如果想升序的话就把if(数组名[j]<数组名[j=1])里面的小于号“<”改成大于号“>”

Js中去除数组中重复元素的4种方法

今天工作遇到此问题,尝试多个方法不尽人意,故此写个博客来总结一下如何在js中去除重复元素. 方法1:         Array.prototype.method1 = function(){             var arr[];    //定义一个临时数组             for(var i = 0; i < this.length; i++){    //循环遍历当前数组                 //判断当前数组下标为i的元素是否已经保存到临时数组