Leetcode-217.[存在重复元素]

31 阅读1分钟

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

示例 1:

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

输出: true

解释: 元素 1 在下标 0 和 3 出现。


示例 2:

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

输出: false

解释: 所有元素都不同。


示例 3:

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

输出: true

方法一:哈希表法

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s; // 改用unordered_set,平均插入/查询时间O(1),比set(O(logn))更快
        for (int num : nums) {
            if (s.count(num)) { // 检查元素是否已存在
                return true;
            }
            s.insert(num); // 不存在则插入
        }
        return false; // 遍历完无重复
    }
};

方法二:排序法

核心逻辑:先对数组排序,重复元素会相邻,只需遍历检查相邻元素是否相同即可。时间复杂度:O (nlogn)(排序的时间),空间复杂度:O (1)(若允许修改原数组)/ O (n)(若需复制数组)。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        if (nums.size() <= 1) return false; // 边界:空数组/单元素数组无重复
        sort(nums.begin(), nums.end()); // 排序后重复元素相邻
        for (int i = 0; i < nums.size() - 1; ++i) {
            if (nums[i] == nums[i+1]) { // 检查相邻元素
                return true;
            }
        }
        return false;
    }
};

方法三:哈希表(简洁版)

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s(nums.begin(), nums.end()); // 直接用数组初始化set,更简洁
        return nums.size() > s.size(); // 一行判断,无需if-else
    }
};