文章目录
前言
今天是开心的一天……
1. 在长度 2N 的数组中找出重复 N 次的元素
给你一个整数数组 nums ,该数组具有以下属性:
nums.length == 2 * n.
nums 包含 n + 1 个 不同的 元素
nums 中恰有一个元素重复 n 次
找出并返回重复了 n 次的那个元素。
1.1 遍历
class Solution {
public:
int repeatedNTimes(vector<int>& nums) {
set<int> ans;
for (auto i : nums) {
if (ans.find(i) !=ans.end()) {
return i;
}
else {
ans.emplace(i);
}
}
return -1;
}
};
1.2 优秀的解法:随机比较
先介绍一个东西:
/* 产生0到n-1的随机数 */
mt19937 gen{random_device{}()};
uniform_int_distribution<int> dis(0, n - 1);
mt19937 gen{random_device{}()};
uniform_int_distribution<int> dis(0, n - 1);
我们可以每次随机选择两个不同的下标,判断它们对应的元素是否相等即可。如果相等,那么返回任意一个作为答案。
时间复杂度期望为O(1),空间复杂度也为O(1)(?)
class Solution {
public:
int repeatedNTimes(vector<int>& nums) {
int n = nums.size();
mt19937 gen{random_device{}()};
uniform_int_distribution<int> dis(0, n - 1);
while (true) {
int x = dis(gen), y = dis(gen);
if (x != y && nums[x] == nums[y]) {
return nums[x];
}
}
}
};
总结
STL还是太强大了,还得多学习……