LeetCode 217:存在重复元素
题目描述
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
【示例 1】
输入: [1,2,3,1]
输出: true
【示例 2】
输入: [1,2,3,4]
输出: false
【示例 3】
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
解题
借助关联容器
借助map或者set都可以,从头到尾遍历数组,如果当前元素在容器中已经存在,直接返回true,否则将该元素插入到容器中。
使用map:
bool containsDuplicate(vector<int>& nums) {
unordered_map<int, bool> dict;
for (int i=0; i<nums.size(); ++i){
if (dict[nums[i]]) //使用[]运算符时,如果不存在,实际上会插入了nums[i],但mapped value初始化为false
return true;
dict[nums[i]] = true;
}
return false;
}
使用set:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> check_set;
for (int i=0; i<nums.size(); ++i){
if (check_set.find(nums[i])!=check_set.end())
return true;
check_set.emplace(nums[i]);
}
return false;
}
};
排序
如果判断一个数组是否有重复元素,可以先对数组进行排序,如果存在重复元素,那么排序好的数组中必然存在两个相邻元素相等。这里借助了快速排序算法。
class Solution {
public:
void qsort(vector<int> &nums, int l, int r){
if (l >= r)
return;
int s = l, e = r;
swap(nums[l], nums[(l+r)>>1]);
int n = nums[l];
while (l < r) {
while (l < r && nums[r] >= n) {
--r;
}
if (l < r){
nums[l] = nums[r];
++l;
}
while (l < r && nums[l] < n) {
++l;
}
if (l < r) {
nums[r]=nums[l];
--r;
}
}
nums[l] = n;
qsort(nums, s, l-1);
qsort(nums, l+1, e);
}
bool containsDuplicate(vector<int>& nums) {
qsort(nums, 0, nums.size()-1);
for (size_t i=1; i < nums.size(); ++i){
if (nums[i]==nums[i-1])
return true;
}
return false;
}
};