题目描述:
给你一个整数数组 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
}
};