题目:
Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.
思路:
这道题目虽然简单,但是也存在一个trade-off的问题,即我们偏向于降低时间复杂度,还是空间复杂度:
1、时间复杂度优先:可以设一个哈希表,记录当前已经访问过的数,一旦发现遇到了此前已经访问过的数,则直接返回true。由于哈希表的插入和查询的时间复杂度都可以被近似地认为是1,所以该算法的时间复杂度是O(n),空间复杂度是O(n)。
2、空间复杂度优先:首先采用in-place的方法将数组排序,然后依次判断相邻的两个数是否相等,如果发现有相等的,就返回true,否则返回false。该算法的时间复杂度是O(nlogn),空间复杂度是O(1)。
代码:
1、时间复杂度优先:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> hash;
for (int i = 0; i < nums.size(); ++i) {
if (hash.count(nums[i]) > 0) {
return true;
}
hash.insert(nums[i]);
}
return false;
}
};
2、空间复杂度优先:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size(); ++i) {
if (nums[i-1] == nums[i]) {
return true;
}
}
return false;
}
};