1.基础篇
题目地址:https://leetcode.com/problems/contains-duplicate/description/
题目描述:判断一个数组中是否有相同的元素,如果有则输出true,否则输出False
解决方法:
性能分析:
评价:这是一个比较机智的解法,先做排序,然后再比较相邻的元素值是否相等,就能输出正确的结果。整个算法的时间复杂度为O(n*logn),空间复杂度为O(1)。需要注意的是 for (int i=0; i<nums.size()-1; ++i)这句中,不能修改为for(int i=0;i<nums.size();i++),这样的写法忽略了i=1 的情况,也可在之前做判断后再写成for(int i=0;i<nums.size();i++)。
参考博客地址:https://blog.csdn.net/ajiangfan/article/details/52620648
2.提高篇
题目地址:https://leetcode.com/problems/contains-duplicate-ii/description/
题目描述:如果数组中相等的元素,且相等的元素的下标之差不能大于K,则返回true,否则false
两重循环报错:
参考大佬解法:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> m;
for (int i = 0; i < nums.size(); ++i) {
if (m.find(nums[i]) != m.end() && i - m[nums[i]] <= k) return true;
else m[nums[i]] = i;
}
return false;
}
};
算法性能:
分析:首先需要一个哈希表,来记录每个数字和其坐标的映射,然后判断当有相同元素且相邻元素的下标差小于k,输出true,否则输出true,整个算法的时间复杂度为O(n),空间复杂度为O(n)。
参考链接:https://www.cnblogs.com/grandyang/p/4539680.html
3.再提高篇
题目地址:https://leetcode.com/problems/contains-duplicate-iii/description/
题目描述:给定一个数组任意两个下标差小于k的两个元素值小于t
解决方法:
if(nums.size() < 2) return false;
vector<pair<long, int>> value;
for (int i = 0; i < nums.size(); ++i)
value.push_back(pair<long, int>(nums[i], i));
sort(value.begin(), value.end());
for (int i = nums.size() - 1; i >= 1; --i)
{
for (int j = i - 1; j >= 0; --j)
{
if (value[i].first - value[j].first > t) break;
else if (abs(value[i].second - value[j].second) <= k) return true;
else continue;
}
}
return false;
k
的二叉搜索树
BST
,遍历数组中的元素,在
BST
上搜索有没有符合条件的数对,若存在则直接返回true,否则将当前元素数对插入
BST
,并更新这个
BST
(若此时
BST
的大小已为k,需要删掉一个值)。保证
BST
的大小小于或等于为
k
,是为了保证里面的数下标差值一定符合条件:
| i - j | <= k
。实现时,可使用
mulitset
来实现
BST
。
参考链接:https://blog.csdn.net/liyuefeilong/article/details/50750299