• 题目难度:简单


  • 题目描述:

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

  • 数据范围:0≤n≤10000

  • 进阶:时间复杂度O(n) ,空间复杂度O(n)

  • 示例一:

    输入:[2,3,1,0,2,5,3]
    返回值:2
    说明:2或3都是对的


  • 思路一 :暴力枚举

    时间复杂度:O(n^2)

    class Solution {
      int duplicate(vector<int>& numbers) {
          // 边界判断
          if (numbers.size() < 1) return -1;
    
          int res = -1, nSize = numbers.size();
          for (int i = 1; i < nSize(); i++) {
              int temp = numbers[i];
              for (int j = i + 1; j < nSize(); j++) {
                  if (temp == numbers[j]) {
                      res = temp;
                      break;
                  }
              }
          }
          return res;
      }
    }

    运行时间:
    图片说明

  • 思路二:排序

    时间复杂度:O(nlogn)

    calss Solution {
      int duplicate(vector<int>& numbers) {
          if (numbers.size() < 1) return -1;
    
          sort(numbers.begin(), numbers.end());  // O(nlogn)
    
          int res = -1;
          int nSize = numbers.size();
          for (int i = 0; i < nSize - 1; i++) {
              if (numbers[i] == numbers[i+1]) {
                  res = numbers[i];
                  break;
              }
          }
          return res;
      }
    }

    运行时间:
    图片说明

  • 思路三:哈希表

    时间复杂度:O(n)

    class Solution {
      int duplicate(vector<int>& numbers) {
          if (numbers.size() < 1) return -1;
          vector<int> hashmap(numbers.size(), 0);
    
          for (int i = 0; i < numbers.size(); i++) {
              hashmap[numbers[i]]++;
              if (hashmap[numbers[i]] > 1) return numbers[i];
          }
          return -1;
      }
    }

    运行时间:
    图片说明