Leetcode 6020. 将数组划分成相等数对
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
1、题目📑
给你一个整数数组 nums ,它包含 2 * n 个整数。
你需要将 nums 划分成 n 个数对,满足:
每个元素 只属于一个 数对。
同一数对中的元素 相等 。
如果可以将 nums 划分成 n 个数对,请你返回 true ,否则返回 false 。
实例1:
输入:nums = [3,2,3,2,2,2]
输出:true
解释: nums 中总共有 6 个元素,所以它们应该被划分成 6 / 2 = 3 个数对。 nums 可以划分成 (2, 2) ,(3, 3) 和 (2, 2) ,满足所有要求。
实例2:
输入:nums = [1,2,3,4]
输出:false
解释: 无法将 nums 划分成 4 / 2 = 2 个数对且满足所有要求。
限制:
nums.length == 2 * n1 <= n <= 5001 <= nums[i] <= 500
2、思路🧠
方法一:数组模拟
- 划分数对,满足每个数对的的元素相等,且每个元素只能划分一次,使用过之后无法再次使用。
- 观察到给我们的数组最大值在500之内,可以模拟510个位置,将数字中的每个值对应到数组中累加,最后统计出现的次数,这里只需要统计偶数次数,如果出现基数次数,很明显的无法与自身构成数对。
- 统计数对的个数必须满足,个数满足 大于 数组的个数的一半。
方法二:哈希表
思路与方法一相同,采用hash表来减少空间的复杂度。
废话少说~~~~~上代码!
3、代码👨💻
第一次commit AC
class Solution {
public boolean divideArray(int[] nums) {
int table [] = new int[510];
int sum = 0;
for(int i = 0; i < nums.length; i++) {
table[nums[i]]++;
}
for(int i= 0; i < table.length; i++) {
if(table[i] % 2 ==0) sum+=table[i]/2;
}
if(sum >= nums.length / 2) return true;
return false;
}
}
时间复杂度:O(N + M) N为数组 nums 中最大的数字,M为数组 nums 的长度
空间复杂度:O(N) N为数组 nums 中最大的数字
第二次commit AC
class Solution {
public boolean divideArray(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int num : nums) {
map.put(num,map.getOrDefault(num,0)+1);
}
int sum = 0;
for(Integer k : map.keySet()) {
if(map.get(k) % 2 ==0) sum+=map.get(k)/2;
}
if(sum >= nums.length / 2) return true;
return false;
}
}
时间复杂度:O(N) N为数组 nums 的长度
空间复杂度:O(N) N为数组 nums 的长度
4、总结
该题目的对模拟进行考察,注意对题目的要求仔细阅读。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!