判断数组中的重复元素

问题,有一个n+1个元素的数组,包含1到n的n个数,外加一个重复元素,将这个重复元素找出。

方法一:使用置换法,由于下标是从0开始,如果nums[i]==i+1,说明元素是放在正确的位置,继续判断。如果nums[i] == nums[nums[i]-1],说明nums[i]就是重复元素,是要求找到的,否则就转换nums[i]和nums[nums[i]-1]

代码如下:

class Solution
{
    public int findDuplicate(int[] nums)
    {
        if (0 == nums.length) return 0;

        for (int i = 0; i < nums.length;)
        {
            if (nums[i] == i + 1)
            {
                i++;
                continue;
            }

            if (nums[i] == nums[nums[i] - 1])
            {
                return nums[i];
            }

            int tmp = nums[i];
            nums[i] = nums[tmp - 1];
            nums[tmp - 1] = tmp;
        }

        return 0;
    }
}

方法二:取反法,在遍历的过程中,将abs(nums[i])-1位置处的数据取反,在取反之前,如果为负,说明这个数是重复的

代码如下:

class Solution
{
    public int findDuplicate(int[] nums)
    {
        if (0 == nums.length) return 0;

        for (int i = 0; i < nums.length; i++)
        {
            int tmp = Math.abs(nums[i]);

            if (nums[tmp - 1] < 0) return tmp;

            nums[tmp - 1] = -nums[tmp - 1];
        }

        return 0;
    }
}

方法三:用floyd判圈法。因为有重复元素,最终会是一个环。这种方法好处是不会修改数据元素

代码如下:

class Solution
{
    public int findDuplicate(int[] nums)
    {
        if (0 == nums.length) return 0;

        int slow = 0, fast = 0;

        slow = nums[slow];
        fast = nums[nums[fast]];

        while (slow != fast)
        {
            slow = nums[slow];
            fast = nums[nums[fast]];
        }

        fast = 0;
        while (slow != fast)
        {
            slow = nums[slow];
            fast = nums[fast];
        }

        return slow;
    }
}
时间: 2024-10-18 08:00:57

判断数组中的重复元素的相关文章

去除数组中的重复元素

方法1:开辟辅助空间 #include<vector> #include<algorithm> #include<iostream> #define LENGTH 10 using namespace std; void Unique(){ int array[LENGTH]={1,1,1,2,2,4,4,6,6,6}; int pre=array[0],cur=array[1]; int temp[LENGTH]; int k=0; int i=1;//cur和i指向

在Java中判断数组中包含某个元素的几种方式的比较

闲来无事,将java中判断数组中包含某个元素的几种方式的速度进行对比,直接上代码 talk is cheap, show you the code package test.contain.lishaojie; import java.util.Arrays;import java.util.HashSet;import java.util.Set; public class TestContain { /** * @param args */ public static void main(S

第11题:移除数组中的重复元素

/* 前几天去爬泰山了,一直没更新,上山时还没什么感觉,下山后简直要崩溃啊,骨头都散了,继续更新...... */ 第11题:移除数组中的重复元素 给定一个升序排列的数组,去掉重复的数,并返回新的数组的长度. 例如: 数组A = {1, 1, 2},你的函数应该返回长度2,新数组为{1, 2} 要求: 不能新开数组分配额外的空间.即常数空间限制. 提示: 输入一个整数n,以及其对应的数组A[n],输出新数组长度 样例输入 5 0 0 1 1 2 样例输出 3 解析: #include <stdi

判断数组是否存在重复元素

假设数组有n个元素,元素取值范围为1~n,如何判断数组是否存在重复元素 将每个元素放到他所应该在的地方.如果在放得时候发现他的坑已经被占了,那么出现重复元素 bool judgRepeatedElement(vector<int> v){ int j = -1; for (int i = 0; i < v.size(); i++){ j = v[i]; if (i == j) //放对位置的 continue; if (v[i] == v[j]) //如果这个坑已经被占 return t

【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】

[026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for anot

删除数组中的重复元素,并返回去重的数组

/*删除数组中的重复元素,并返回去重的数组*/ function delRepeatNum(arr){ var result = []; var middleObj = {}; var temp; for(var i = 0; i < arr.length; i++){ temp = arr[i]; middleObj[temp] = 1; } for(temp in middleObj){ result.push(temp); } return result; }

javascript 判断数组中的重复内容的两种方法 by FungLeo

javascript 判断数组中的重复内容的两种方法 by FungLeo 前言 一般,我们可能会给数组去重,这个操作并不复杂,执行一个循环就是了.现在,我要做的是,判断数组中是否有重复的内容,如果有,返回 true 否则,返回 false. 思路 把数组变成字符串 循环原数组,拿每一个字段和这个字符串进行比对,看是否有重复 如何拿A字符串和B字符串进行对比,并且要求判断出B字符串中包含过个A字符串呢? 方法一 indexOf() 和 lastIndexOf() 对比法. 首先,我们构建代码:

计蒜客 移除数组中的重复元素

移除数组中的重复元素 给定一个升序排列的数组,去掉重复的数,并返回新的数组的长度. 例如: 数组A = {1, 1, 2},你的函数应该返回长度2,新数组为{1, 2} 要求: 不能新开数组分配额外的空间.即常数空间限制. 提示: 输入一个整数n,以及其对应的数组A[n],输出新数组长度 样例输入 5 0 0 1 1 2 样例输出 3 1 #include<iostream> 2 #include<vector> 3 #define MAX 100000 4 using names

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

1.去重 清除数组中重复出现的元素: var    arr1 = [ 1,3,3,4,4 , 4,"aba","aba" ];   //数组字面量的形式创建数组. var    arr2 = [ ]; for ( var i=0; i<arr1.length; i++){ if(arr2.indexOf(arr1[i])<0){          // 在数组arr2中匹配是否有arr[i]这个元素存在,有就返回这个元素在数组中的下表位置,没有匹配返回-