zoukankan      html  css  js  c++  java
  • 使用散列表来降低时间复杂度

    题目描述

    在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
     
     1 /*
     2      *思路:
     3      *查找数组中重复的数字:
     4      *这题有明确定义数组中的数字大小不超过数组的长度并且大于0,所以可以用散列表来做,这样应该不会内存越界 
     5      *
     6      *位图:
     7      *即申请一个数组长度的位图数组,并初始化为0,正好可以以数组的下标作为每个数字的索引,然后位图数组的值作为该索引位置数字出现的次数.
     8      *最后扫一遍位图数组,找到第一个值大于1的即可.
     9      *
    10      *可以用java的数据结构HashMap做,不过就没什么意思了,都没有用到题目的特性.
    11      *编程就是应该特殊情况考虑特殊的数据结构.
    12      */
    13 
    14     public boolean duplicate(int numbers[],int length,int [] duplication) 
    15     {
    16         if(length <= 1)
    17         {
    18             return false;
    19         }
    20         
    21         int bitMapNumber[] = new int[length];
    22         
    23         for(int i = 0; i < length; i++)
    24         {
    25             bitMapNumber[i] = 0;
    26         }
    27         
    28         for(int i = 0; i < length; i++)
    29         {
    30             bitMapNumber[numbers[i]]++;
    31         }
    32         
    33         for(int i = 0; i < length; i++)
    34         {
    35             
    36             if(bitMapNumber[i] > 1)
    37             {
    38                 duplication[0] = i;
    39                 
    40                 return true;
    41             }
    42             
    43         }
    44         
    45         return false;
    46     }
  • 相关阅读:
    aws 计费查询
    关于网络抖动
    word2vec和onehot
    缺少了目标的教育是彻底的失败
    做事要风险控制
    SPS中计算值公式函数简介
    Moss + InfoPath 表单工作流开发要点
    【译】What is the NDK? (2)
    【译】What is the NDK? (1)
    【译】Android平台上的Flex开发(3) 在桌面和移动设备上测试
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/5024343.html
Copyright © 2011-2022 走看看