Leetcode每周.周赛第286场周赛 六方云专场 集合差集 + 遍历考察

📖本篇内容:Leetcode每周.周赛第286场周赛 六方云专场
📑 文章专栏:leetcode周赛打卡《周周打卡》
📆 最近更新:2022 年 3 月 13 日 leetcode每周.周赛第284场周赛 理想汽车专场 ~ 暴力模拟思维考察
🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)
🌇 点赞 👍 收藏 ?留言 📝 一键三连 关爱程序猿,从你我做起

📖本文目录
  • 🙊写在前面
  • 📆第286场周赛——2022-03-27
    • 📝T1.5268. 找出两数组的不同
      • 题目
      • 示例
      • ?思路 ?
      • 代码实现
      • 执行结果
    • 📝T2. 5236. 美化数组的最少删除数
      • 题目
      • 示例
      • 提示
      • ?思路 ?
      • 代码实现
      • 执行结果
  • 🙊写在最后

🙊写在前面 【Leetcode每周.周赛第286场周赛 六方云专场 集合差集 + 遍历考察】🙊小付来喽,今天接着有更新周赛栏目了哦
📆第286场周赛——2022-03-27 📝T1.5268. 找出两数组的不同 题目
给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:
answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表 。
answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表 。
注意:列表中的整数可以按 任意 顺序返回 。
示例 示例1:
输入:nums1 = [1,2,3], nums2 = [2,4,6]输出:[[1,3],[4,6]]解释:对于 nums1 ,nums1[1] = 2 出现在 nums2 中下标 0 处,然而 nums1[0] = 1 和 nums1[2] = 3 没有出现在 nums2 中 。因此,answer[0] = [1,3] 。对于 nums2 ,nums2[0] = 2 出现在 nums1 中下标 1 处,然而 nums2[1] = 4 和 nums2[2] = 6 没有出现在 nums2 中 。因此,answer[1] = [4,6] 。 示例2:
输入:nums1 = [1,2,3,3], nums2 = [1,1,2,2]输出:[[3],[]]解释:对于 nums1 ,nums1[2] 和 nums1[3] 没有出现在 nums2 中 。由于 nums1[2] == nums1[3] ,二者的值只需要在 answer[0] 中出现一次,故 answer[0] = [3] 。nums2 中的每个整数都在 nums1 中出现,因此,answer[1] = []。 ?思路 ? 📖本题思路以及考察点:
  • Set存储数据寻找集合差集
代码实现 class Solution {public List> findDifference(int[] nums1, int[] nums2) {List> res = new ArrayList<>();Set set1 = new HashSet<>();Set set2 = new HashSet<>();for (int i : nums1){set1.add(i);}for (int i : nums2){set2.add(i);}Listtmp = new ArrayList<>();for (int i = 0;itmp1 = new ArrayList<>();for (int i = 0;i 执行结果
📝T2. 5236. 美化数组的最少删除数 题目
给你一个下标从 0 开始的整数数组 nums ,如果满足下述条件,则认为数组 nums 是一个 美丽数组 :
nums.length 为偶数
对所有满足 i % 2 == 0 的下标 i ,nums[i] != nums[i + 1] 均成立
注意,空数组同样认为是美丽数组 。
你可以从 nums 中删除任意数量的元素 。当你删除一个元素时,被删除元素右侧的所有元素将会向左移动一个单位以填补空缺,而左侧的元素将会保持 不变。
返回使 nums 变为美丽数组所需删除的 最少 元素数目 。
示例 示例1:
输入:nums = [1,1,2,3,5]输出:1解释:可以删除 nums[0] 或 nums[1] ,这样得到的 nums = [1,2,3,5] 是一个美丽数组 。可以证明,要想使 nums 变为美丽数组,至少需要删除 1 个元素 。 示例2:
输入:nums = [1,1,2,2,3,3]输出:2解释:可以删除 nums[0] 和 nums[5] ,这样得到的 nums = [1,2,2,3] 是一个美丽数组 。可以证明,要想使 nums 变为美丽数组,至少需要删除 2 个元素 。 提示 ?思路 ? 📖本题思路以及考察点:
  • 这道题一开始拿到手的第一时间想到的是如何进行贪心求解,但是害怕贪不出来,试了半天,罚了两次,感觉是可以贪出来的 卡在样例 87 ,总感觉哪里不对劲,赛后看别人的题解才知道 每次贪的位置改变出错了 ,但是对于这道题,小付也看到了好几种不错的题解,学习一下,争取下次遇到无法求解的题能快速转换思路求解 。
ShinyRuoの 的简单遍历 求解 —— 这个可能是最好懂的
小付对上述题解的简单理解:
  • 为了完成找到美化数组的最少删除次数,我们首先需要理解题意,题中有两个关键点需要注意:
  • 1、当你删除一个元素时,被删除元素右侧的所有元素将会向左移动一个单位以填补空缺,而左侧的元素将会保持 不变。
  • 2、nums.length 为偶数 ,对所有满足 i % 2 == 0 的下标 i ,nums[i] != nums[i + 1] 均成立
  • 我们要求的是最少删除数使得当前数组为美化数组,计做删除cnt个数 。每次删除之后我们的删除过后的右侧的数据下标均会左移,那我们可否将cnt视作为左移的次数,当我们再次遍历删除过后的数组下标后带着这个左移的次数进行遍历判断当前下标是否满足(i -cnt )% 2== 0 的同时 满足 nums[i] == nums[i+1] 如果满足,则需要删除的次数增加,那么删除后数组的下标也可以确定一次遍历即可,需要额外注意的就是,如果删除 cnt 次之后 原数组中的元素个数为奇数时也是不能满足条件的需要额外再删除一个元素 。
双指针做法(有了上述的方法铺垫,很容易也可以想到一个双指针的做法)
双指针思路:
  • 也是一次遍历,而双指针的难点在于如何确立删除元素之后数组的坐标进行确定 。
代码实现 一次遍历
class Solution {public int minDeletion(int[] nums) {int n = nums.length;int cnt = 0;for (int i = 0;i 执行结果 🙊写在最后 小付打卡的第11场单周赛 2022-3-27
尽可能把会做的题 都做好 就可以了
本次周赛 落回一题选手 =-= 菜是真菜,又菜又爱打, 贪了半天也贪不出来,直接摆烂