当前位置: 首页 > article >正文

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)



http://www.kler.cn/a/5638.html

相关文章:

  • Linux (CentOS) 安装 Docker 和 Docker Compose
  • SQL多表联查、自定义函数(字符串分割split)、xml格式输出
  • 企业架构开展所需的组织管理能力
  • 使用ZLAN8308M串口服务器4G通信功能解决远程智能无线电表方案
  • Mybatis(五):动态SQL
  • java中File转为MultipartFile的问题解决
  • 153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]
  • CSS基础笔记
  • 五种Python中字典的高级用法
  • 【致敬嵌入式攻城狮第2期活动预热征文】学习安排
  • Java SE 基础(8)关键字和保留字
  • Redis管道(pipeline)
  • ChatGPT可以作为一个翻译器吗?
  • LeetCode-0330
  • 从源码全面解析 synchronized 关键字的来龙去脉
  • 【Git从入门到精通】分支机制
  • 44-二叉树练习-LeetCode606根据二叉树创建字符串
  • 初级网络工程师这30道面试题一定得会,建议小白收藏!
  • Linux基础内容(17)—— 软硬链接
  • 如何安全高效地管理多个Facebook、Google、AMZ账号?
  • 山东大学-飞桨人工智能教育创新中心正式挂牌,打造区域产教融合新范式
  • redis中序列化后的对象后当如何修改