数组重复元素查找:
解法一 :sort 后相邻位比较 40ms
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;
}
};
解法二:采用STL的 unordered_set 基本hash思想 52ms
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> st;
for (auto n : nums) {
if (st.find(n) != st.end()) return true;
else st.insert(n);
}
return false;
}
};
解法三:map记录已存在的int
class Solution {
public:
bool containsDuplicate(vector<int>& nums) { //runtime:104ms
if(nums.size()<=1)return false;
map<int,bool> m;
for(int i=0;i<nums.size();i++){
if(m[nums[i]]==true)return true;
m[nums[i]]=true;
}
return false;
}
};
解法四:自己手写一个快排算法 36ms
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int len = nums.size();
if (len < 1) {
return false;
}
quick_sort(nums, 0, len);
int prev = nums[0];
for (int i=1; i<len; i++) {
if (nums[i] == prev) {
return true;
}
prev= nums[i];
}
return false;
}
void quick_sort(vector<int>& nums, int start, int end) {
if (start >= end) {
return;
}
int di = partition(nums, start, end);
quick_sort(nums, start, di);
quick_sort(nums, di + 1, end);
}
int partition(vector<int>& nums, int start, int end) {
if (start >= end) {
return -1;
}
end--;
swap(nums[(start + end) / 2], nums[end]);
int pv = nums[end];
int di = start;
for (int i=start; i<end; i++) {
if (nums[i] < pv) {
swap(nums[i], nums[di++]);
}
}
swap(nums[end], nums[di]);
return di;
}
};