美文网首页
剑指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