美文网首页
剑指offer:数组中重复的数字

剑指offer:数组中重复的数字

作者: 进击的码农 | 来源:发表于2019-01-22 23:52 被阅读0次
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数。请找出数组中任意一个重复的数字。
思路:
1、首先想到的是排序,然后再做处理;
2、利用哈希表,数组中值作为key,出现次数作为value(当然此处也可用数组代替哈希表),构造完哈希表后,查询value大于1的key,空间复杂度O(n),时间复杂度O(n);
3、不使用额外的空间,将数组中值为i的元素换到i位置
举个例子
arr={2,3,1,0,2,5}
输出为:2
index:0  (2,3,1,0,2,5)2与1交换
          (1,3,2,0,2,5)1与3交换
          (3,1,2,0,2,5)3与0交换
          (0,1,2,3,2,5)0处于index=0的位置
          (0,1,2,3,2,5)1处于index=1的位置
           ......
遍历到index=4时,会发现index=2位置上已经有2了,故2重复了。
方法三的java代码如下
public class code_2_solution {
    /***
     * 查找数组中重复的数字
     * @param arr
     * @return
     */
    public static int findDuplicateNum(int[] arr) {
        int res= Integer.MAX_VALUE;
        if(arr==null || arr.length==0) return res; 
        for (int i=0;i<arr.length;i++) {
            while(arr[i] !=i) {
                if (arr[i]==arr[arr[i]]) {
                    res = arr[i];
                    break;
                }
                swapNum(arr,i);

            }
        }
        return res;
    }

    public static void swapNum(int[] arr, int index){
        int temp = arr[index];
        arr[index] = arr[temp];
        arr[temp] = temp;
    }
    
}

难免纰漏,欢迎指正。

相关文章

网友评论

      本文标题:剑指offer:数组中重复的数字

      本文链接:https://www.haomeiwen.com/subject/acfdjqtx.html