c++ day 7、day8--- 219 存在重复元素ii unordered_set使用学习,暴力及优化
vector<int>& a;
vector<int> a;
说明: 带&表示传入函数的是vector的引用(即物理位置),函数内部对vector改动,vector就会改变;
不带&表示传入的是vector的复制品(开辟了另一块位置),函数内部对其改动,不会影响原本的vector;
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
for (int i = 0; i < nums.size(); i++)
{
for (int j = 0; j < nums.size(); j++)
{
if ((abs(i - j) <= k) & (nums[i] == nums[j]) & (i!= j))
{
return true;
}
}
}
return false;
}
};
int main()
{
vector<int> nums= { 1,2,3,1,2,3 };
int k = 2;
Solution s1;
bool ans = s1.containsNearbyDuplicate(nums,k);
cout << "zc is " << ans << endl;
return 0;
}
2 学习别人的代码
讲解链接:
https://www.bilibili.com/video/BV1oo4y117nN/?spm_id_from=333.337.search-card.all.click&vd_source=ee789cf916563b0f6fa47fd0f3556c63
c++ unordered_set详细操作链接:
见https://blog.csdn.net/qq_40286920/article/details/124731777
array = [1,2,3,1,2,3]; k =2
思路:建立一个空set,遍历数组,依次判断,从第一个元素开始,判断当前元素是否在set内,不在,则将当前元素加入set;在,在则
遍历第一个元素,1不在set,将1加入set,然后比较当前元素和当前元素的第前k个元素是否相等,第k个元素不存在,也即不相等;set = [1],继续
第2个元素,2,不在set,加入set,set = [1,2],判断当前元素和当前元素的第前k个元素是否相等,同样,超出索引,继续
第3个元素,3,不在set,加入set,set = [1,2,3]; 判断当前元素3和前第k个元素(1)是否相等,不相等,循环还要继续,继续判断第K个元素在set内与否,不在,在,从set删除 ,set = [2,3]
第四个元素,1,不在set,加入set,set = [2,3,1]; 当前元素1和前第k个元素(2)不相等,第k个元素(2)在set内,从set删除,
注:判断第k个元素是否在set内,在要删除的目的,怎么理解?
比如以第3个元素,3,为例,将3加入set之后,set变成了 [1,2,3], 此时当前元素3和前第k个元素(1)是不相等,也就是还没有找到满足条件的位置,之后还要继续遍历和判断下一个元素,但是对于下一个元素(1)来说,他只需要比较前k个元素即可,而当前元素的第k个元素对于下一个元素(1)来说,是第k-1个元素,已经不在第四个位置元素(1)需要判断的范畴了,所以可以从set里面将其删除,也就是说,set里面最多保存当前元素的第前k-1个元素,对这题来说只保留1个元素,加上自己总共保留k个元素(对这题来说是2)
根据我的理解写的
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if (k == 0)
{
return false;
}
unordered_set<int> set1;
for (int i = 0; i < nums.size(); i++)
{
if (set1.count(nums[i]) == 0) //判断当前元素在set里面的出现次数,0就是不在
{
set1.insert({ nums[i] });
if ((i - k) >= 0 && nums[i] != nums[i - k])
{
//if (set1.count(nums[i-k]) == 1)
//{ 这里不需要再加if判断了,当前数在前面一定是存在set里面的,也是一定会被删掉的
set1.erase(nums[i-k]);
//}
}
if ((i - k) >= 0 && nums[i] == nums[i - k])
{
return true;
}
}
else //当前元素在set里面,说明前k个元素,有一个和自己的是相等的
{
return true;
}
}
return false;
}
};
int main()
{
vector<int> nums= { 1,2,1};
int k = 0;
Solution s1;
bool ans = s1.containsNearbyDuplicate(nums,k);
cout << "zc is " << ans << endl;
return 0;
}
精简版
![在这里插入图片描述](https://img-blog.csdnimg.cn/89a9cb003c3e49da8e2bb86651dc33dd.jpeg#pic_center)