LeetCode 217、存在重复元素(c++)(0基础附带语法)(官方数据结构入门计划第一题)

130 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

   首先看题目:

      217、给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false

示例 1: 输入:nums = [1,2,3,1] 

输出:true 

示例 2: 输入:nums = [1,2,3,4] 

输出:false 

示例 3: 输入:nums = [1,1,1,3,3,4,3,2,4,2] 

输出:true 

 其次,一定要注意提示中限定的范围:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

      这是一道经典一看就是用hash(哈希)表解决的问题。可能有的同学不懂哈希表,我简单说一下,(仅仅用于简单说明,不是专业解答)。

        哈希表简单点说就是:把一个元素放到一个容器(哈希表)中,取出来的时候时间复杂度是o(1),

[1]、hash表,代码如下
  class Solution {
  public:
      bool containsDuplicate(vector<int>&nums) {
          unordered_set<int>u;   //建立哈希表
          for (int x: nums) {//利用一个叫做x的变量遍历nums这个容器
              if (u.find(x) != u.end()) {//检查一下x变量所存储的值是否已经存在了哈希表u中
                  return true;
              }
              u.insert(x);//往哈希表u中插入元素
          }
          return false;
      }
  };

[2]、排序后判断

简单说一下第二种,开始我也没有想到这个,是看了别人写的代码才理解。

  bool containsDuplicate(vector<int>& nums) {
      sort(nums.begin(), nums.end());//c++STL标准库中写的函数,使用之前请#include<algorithm>
      int n=nums.size();//注意为什么要用这个n,因为nums.size()返回的是无符号数,和整数判断容易出错,详细要去学习计算机组成原理,这里不细说
      for (int i = 0; i < n - 1; i++) {//注意这里i<n-1,而不是我们常写的i<n,否则i+1会越界
          if (nums[i] == nums[i + 1]) {
              return true;
          }
      }
      return false;
  }