3、数组中重复的数字

数组中重复的数字

一:题目描述:

在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

Input:
{2, 3, 1, 0, 2, 5}

Output:
2

要求时间复杂度 O(N),空间复杂度 O(1)。

二:思路

因为要求时间复杂度为O(N),空间复杂度为O(1),所以不能够使用排序算法以及额外的标记数组。
题目为一个长度n的数组,数据范围为0——n-1,那么我们可以对数组中的数据进行换位,让数据i放在下标为i的位置上,即array[i] = i;同时在交换位置是判断一下,看第i个位置上是否已经有了数值为i的数据,如果有则证明数据重复。
步骤详解图

三:代码:


public class Demo03 {
  /*
    在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。
    数组中某些数字是重复的,但不知道有几个数字是重复的,
    也不知道每个数字重复几次。

    请找出数组中任意一个重复的数字。

   */

    public static void main(String[] args) {
        int[] array = {2,3,1,0,2,5};
        int rep = findRep(array);
        System.out.println("重复数据为:"+rep);
    }

    public static int findRep(int[] array){
        //判断
        if (array == null||array.length<=0){
            return -1;
        }

        for (int i = 0; i < array.length; i++) {
            while (array[i]!=i){
                /*
                判断一下,如果当交换位置的时候,原来i的位置已经是i了,这时证明找到
                重复数据
                 */
                if (array[i] == array[array[i]]){
                    return array[i];
                }

                /*不相等,那么将i位置的数据,放入到array[i]位置,
                原本在array[i]位置的数据放入到i位置上
                 */
                swap(array,i,array[i]);
            }
        }
        return -1;
    }

    public static void swap(int[] array,int i, int num){
        int temp = num;
        array[i] = array[num];
        array[num] = temp;
    }
}

发布了24 篇原创文章 · 获赞 5 · 访问量 2059

猜你喜欢

转载自blog.csdn.net/weixin_43288447/article/details/104223246