zoukankan      html  css  js  c++  java
  • 查找数组中重复的数字

    问题描述:在长度为n的数组中,所有的元素都是0到n-1的范围内。 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字。 例如,输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出为2或3

    解法一:将输入的数组进行排序,遍历排序后的数组找到重复的数字。排序一个长度为n的数字的时间复杂度为O(nlogn),所以这种方法的时间    复杂度为O(nlogn)。

    解法二:使用哈希表来解决这个问题。从头到尾顺序扫描数组中的每一个数,没扫描一个数字可以用O(1)的时间在哈希表中判断是否包含此数    字,如果哈希表中没有此数字就将此数字加入到哈希表中,如果哈希表中已存在此数字就找到重复的数字。时间复杂度为O(n),但是    空间复杂度也为O(n),以空间换区时间。

    解法三:数组中的数字为0到n-1的范围内。如果这个数组中没有重复的数字,则对应的i位置的数据也为i。可以重排此数组,扫描数组中的每    一个数字,当扫描到下标为i的数字时,首先比较这个数字(m)是不是等于i。如果是,接着扫描下一个数字。如果不是,再拿它和第    m个数字比较,如果相等则找到重复的数据。否则就把第i个数字与第m个数字交换。重复这个比较、交换的过程,直到找到重复的数     字。

    package com.wyl;
    /**
     * 找到数组中重复的数字
     * 问题描述:在长度为n的数组中,所有的元素都是0到n-1的范围内。
     * 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字。
     * 例如,输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出为2或3
     * @author wyl
     *
     */
    public class DuplicateNumber {
    
        public static void main(String[] args) {
            int[] array = {2,3,1,0,2,5,3};
            int duplicate = duplicateNumber(array);
            System.out.println("重复的数字为: " + duplicate);
        }
    
        /**
         * 求数组中重复的数字
         * 分析:如果数组中没有重复的数字,则第i位置应该放置的数字为i。可以重排此数组,让对应位置上的数字对应。
         * @param array
         * @return
         */
        private static int duplicateNumber(int[] array) {
            // TODO Auto-generated method stub
            if(array == null || array.length <= 0){
                return -1;
            }
            for(int i=0;i<array.length;i++){ //判断输入数组的合法性
                if(array[i] < 0 || array[i] >= array.length){
                    return -1;
                }
            }
            for(int i=0;i<array.length;i++){
                if(i != array[i] && array[i] == array[array[i]]){ //重复数据
                    return array[i];
                }
                while(i != array[i]){ //将数字与第m个位置上的数字交换
                    exchange(array, i, array[i]);
                }
            }
            return -1;
        }
        
        /**
         * 交换数组array中的第i位和第j位
         * @param array
         * @param i
         * @param j
         */
        public static void exchange(int[] array, int i, int j){
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }

    问题描述:在长度为n的数组中,所有的元素都是0到n-1的范围内。
     * 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字。
     * 例如,输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出为2或3

  • 相关阅读:
    编译impala2.0.0
    CentOS 7 安装Boost 1.61
    CentOS 6.4 编译安装LLVM3.3,Clang和Libc++
    批量修改dos文件到unix
    git win7 dos下设置代理
    vim源码编译启用python
    一张图看懂天津市教育云服务平台
    关于git中Pageant开机启动且自动关联秘钥
    Windows 10安装pip方法
    大数据中心的业务研发路线
  • 原文地址:https://www.cnblogs.com/studyDetail/p/7273963.html
Copyright © 2011-2022 走看看