zoukankan      html  css  js  c++  java
  • 剑指offer:数组中重复的数字

    题目描述:

    在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

    解题思路:

    思路一:排序。遍历判断一次。时间复杂度O(nlogn)。

    思路二:用空间换时间。利用哈希表对应每一个数字,遍历第一遍,计算每个数字出现次数。遍历第二次,找到第一个重复数字,输出。时间复杂度O(n)。

    思路三:不利用辅助空间。

    代码:

    思路二:

    class Solution {
    public:
        // Parameters:
        //        numbers:     an array of integers
        //        length:      the length of array numbers
        //        duplication: (Output) the duplicated number in the array number
        // Return value:       true if the input is valid, and there are some duplications in the array number
        //                     otherwise false
        bool duplicate(int numbers[], int length, int* duplication) {
            if(length<=0)
                return false;
            int hash[length];
            for(int i=0; i<length; i++)
                hash[i]=0;
            for(int i=0; i<length; i++)
            {
                hash[numbers[i]]++;
            }
            for(int i = 0; i<length; i++)
            {
                if(hash[i]>1)
                {
                    *duplication = i;
                    return true;
                }
            }
            return false;
        }
    };

    思路三:

    class Solution {
    public:
        // Parameters:
        //        numbers:     an array of integers
        //        length:      the length of array numbers
        //        duplication: (Output) the duplicated number in the array number
        // Return value:       true if the input is valid, and there are some duplications in the array number
        //                     otherwise false
        bool duplicate(int numbers[], int length, int* duplication) {
            if(length<=0)
                return false;
            int temp;
            for(int i = 0; i<length; i++)
            {
                if(i==numbers[i])
                    continue;
                else
                {
                    if(numbers[i] == numbers[numbers[i]])
                    {
                        *duplication = numbers[i];
                        return true;
                    }
                    else
                    {
                        temp = numbers[i];
                        numbers[i] = numbers[temp];
                        numbers[temp] = temp;
                    }
                }
            }
            return false;
        }
    };
  • 相关阅读:
    Two Sum II
    Subarray Sum
    Intersection of Two Arrays
    Reorder List
    Convert Sorted List to Binary Search Tree
    Remove Duplicates from Sorted List II
    Partition List
    Linked List Cycle II
    Sort List
    struts2结果跳转和参数获取
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10623923.html
Copyright © 2011-2022 走看看