剑指 Offer 03. 数组中重复的数字

/*
    1、最直观的想法是,我直接一个俩层循环,一个一个比,不过效率太差了;
    2、第二种思路,长度为n的数组,数字都在 0~ n-1 的范围,这样如果我们把这个数组按升序排列
    扫描这个数组的元素,若数组不重复,会发现 第 i 个元素必定 为 i。
    所以得出这样的思路 
            1)从头扫描数组,下标为 i 的数字 是不是等于 i
                    是:继续扫描
                    不是:将其和第 i 个数字比较,比较结果
                            若相等,重复,返回该数字
                            若不相等,交换这俩个数字
            2)扫描完毕,未发现重复,返回-1
*/
class Solution {
    public int findRepeatNumber(int[] nums) {
        for(int i = 0;i < nums.length;i++){
           while(nums[i] != i){
               if(nums[i] == nums[nums[i]]){
                   return nums[i];
               }
               int tmp = nums[i];
               nums[i] = nums[tmp];
               nums[tmp] = tmp;
           }
        }
        return -1;
    }
}

 

posted @ 2020-12-12 11:54  peanut_zh  阅读(79)  评论(0编辑  收藏  举报