zoukankan      html  css  js  c++  java
  • 剑指offer系列——50.数组中重复的数字*

    Q:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
    T:
    1.用hash。因为不用记录数目,可以创建bool的数组,bool占用空间更小。
    2.把当前序列当成是一个下标和下标对应值是相同的数组;遍历数组,判断当前位的值和下标是否相等: 2.1. 若相等,则遍历下一位; 2.2. 若不等,则将当前位置i上的元素和a[i]位置上的元素比较:若它们相等,则成功!若不等,则将它们两交换。换完之后a[i]位置上的值和它的下标是对应的,但i位置上的元素和下标并不一定对应;重复2.2的操作,直到当前位置i的值也为i,将i向后移一位,再重复2.

        bool duplicate(int numbers[], int length, int *duplication) {
            for (int i = 0; i < length; i++) {
                int index = numbers[i];
                if (index < 0 || index >= length)
                    return false;
            }
            for (int i = 0; i < length; i++) {
                while (i != numbers[i]) {
                    int a = numbers[i];
                    int b = numbers[numbers[i]];
                    if (numbers[i] == numbers[numbers[i]]) {
                        *duplication = numbers[i];
                        return true;
                    } else {
                        int temp = numbers[i];
                        numbers[i] = numbers[temp];
                        numbers[temp] = temp;
                    }
                }
            }
            return false;
        }
    

    P.S.一开始交换写错了写成了这:

    int temp = numbers[i];
    numbers[i] = numbers[numbers[i]];
    numbers[numbers[i]] = temp;
    

    于是就错了……进了死循环
    另注意,这样出来的并不是第一个重复的数字,而题目里也是随机一个重复的数字即可。

    3.题目里写了数组里数字的范围保证在0 ~ n-1 之间,所以可以利用现有数组设置标志,当一个数字被访问过后,可以设置对应位上的数 + n,之后再遇到相同的数时,会发现对应位上的数已经大于等于n了,那么直接返回这个数即可。

    bool duplicate(int numbers[], int length, int* duplication) {
        for(int i=0;i!=length;++i){
            int index=numbers[i]%length;
            if(numbers[index]>=length){
                *duplication=index;
                return 1;
            }              
            numbers[index]+=length;  
        }
        return 0;
    }
    
  • 相关阅读:
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 454 四数相加 II
    Java实现 LeetCode 454 四数相加 II
    Java实现 LeetCode 454 四数相加 II
    FFmpeg解码H264及swscale缩放详解
    linux中cat more less head tail 命令区别
    C语言字符串操作总结大全(超详细)
    如何使用eclipse进行嵌入式Linux的开发
  • 原文地址:https://www.cnblogs.com/xym4869/p/12350407.html
Copyright © 2011-2022 走看看