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

    题目描述

    在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
     
    方法一:
      从0位置遍历,开辟一个lenght大小的数组,统计每个数字出现的次数,当某个数字出现的次数大于1时,则是第一个重复数字
      缺点:需要开辟lenght大小的额外空间
     
    方法二:
      在原数组上进行交换排序,因为题目原意为:数字保证为0-n-1,【代码中我没有判断不是这种情况】,那么排序时,一定是i位置数字为i,在交换中碰到了重复数字,则输出
     
     1 class Solution01 {
     2 public:
     3     // Parameters:
     4     //        numbers:     an array of integers
     5     //        length:      the length of array numbers
     6     //        duplication: (Output) the duplicated number in the array number
     7     // Return value:       true if the input is valid, and there are some duplications in the array number
     8     //                     otherwise false
     9     bool duplicate(int numbers[], int length, int* duplication) {
    10         vector<int>v(length, 0);
    11         for (int i = 0; i < length; ++i)
    12         {
    13             v[numbers[i]]++;
    14             if (v[numbers[i]] > 1)
    15             {
    16                 *duplication = numbers[i];
    17                 return true;
    18             }
    19         }
    20         return false;
    21     }
    22 };
    23 
    24 
    25 class Solution02 {
    26 public:
    27     // Parameters:
    28     //        numbers:     an array of integers
    29     //        length:      the length of array numbers
    30     //        duplication: (Output) the duplicated number in the array number
    31     // Return value:       true if the input is valid, and there are some duplications in the array number
    32     //                     otherwise false
    33     bool duplicate(int numbers[], int length, int* duplication) {
    34         for (int i = 0; i < length; ++i)
    35         {
    36             while (numbers[i] != i)
    37             {
    38                 if (numbers[i] == numbers[numbers[i]])
    39                 {
    40                     *duplication = numbers[i];
    41                     return true;
    42                 }
    43                 swap(numbers[i], numbers[numbers[i]]);
    44             }
    45         }
    46         return false;
    47     }
    48 };
  • 相关阅读:
    b_jd_水坑数量(向外流dfs)
    b_wy_购买商品使得满减最省(01背包)
    b_wy_最优路径(构造树+dfs)
    Redis:List列表相关指令
    Redis:String字符串常用指令
    Redis:linux基本的指令
    Redis:redis-benchmark性能测试/压力测试
    Redis:增大并发量的演进过程
    Kafka的下载安装和测试,及消费端数据中文乱码问题
    Git:常用命令
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11650464.html
Copyright © 2011-2022 走看看