题目大意:
K 和数对的最大数目
给你一个整数数组 nums 和一个整数 k 。
每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。
返回你可以对数组执行的最大操作数。
示例 1:
输入:nums = [1,2,3,4], k = 5 输出:2 解释:开始时 nums = [1,2,3,4]: 移出 1 和 4 ,之后 nums = [2,3] 移出 2 和 3 ,之后 nums = [] 不再有和为 5 的数对,因此最多执行 2 次操作。
示例 2:
输入:nums = [3,1,3,4,3], k = 6 输出:1 解释:开始时 nums = [3,1,3,4,3]: 移出前两个 3 ,之后nums = [1,4,3] 不再有和为 6 的数对,因此最多执行 1 次操作。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= k <= 109
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1679
解题思路分析:
将本题大意用一句话来概括即是,在不重复使用数组元素的前提下,数组中2数之和为k的组合个数。这道题难度并不大,挺多算是加强版的Two Sum。解题时我们首先遍历一遍数组,使用HashMap来保存每种数字出现的次数,key为该数字,value为该数字出现的次数。接下来,我们遍历HashMap的key,也就是数组中存在的每一种数字,题目要求找出所有2数之和为k的组合,因此,当前数字key与数字k-key之和一定是k(废话)。这时我们只需查看数字key和k-key出现过的次数count1和count2,Min(count1, count2)即是合理的个数,将其累加至返回结果即可。举个例子,比如k为8,当前数字key是2,那么k-key为6,此时,如果数组中2的个数为3,6的个数为10,那么我们只能组成3组(2+6)。解题时需注意,遍历完当前数字后,为了不被重复计算,我们需要将数字(k-key)的个数设置为0。
此外本题还存在一个需要小心的地方,即当前数字key与(k-key)相同的情况。比如k等于8,当前数字key为4,这时(k-key)同样为4,这种情况下Min(count1, count2)可不是合理解,例如数字4的个数为10,但我们无法找出10对4,而只能找出5对4。因此该情况下的解为count1/2。
实现代码:
public int maxOperations(int[] nums, int k) { Map<Integer, Integer> map = new HashMap<>(); // 记录数组中每种数字的个数 for(int n : nums){ // 循环每个数字 if(n>=k) continue; // 如果当前数字大于等于k,跳过。 int count = map.getOrDefault(n, 0); // 当前数字个数 map.put(n, count+1); // 加一后更新当前数字个数 } int res=0; // 返回结果 Set<Integer> keySet = map.keySet(); // 数组中的每一种数字 for(int key : keySet){ // 循环数组中的每一种数字 int n1=key, n2=k-n1; // 和为k的两个数字 if(map.get(n2)==null) continue; // 如果n2不存在,直接跳过 int count1=map.get(n1); // n1的个数 int count2=map.get(n2); // n2的个数 if(count1==0||count2==0) continue; // 任何一个个数为0时,跳过 if(n1==n2) res+=count1 / 2; // 如果两数相同,将个数的一半添加至返回结果 else res+=Math.min(count1,count2); // 如果两数不同,将个数较少一方添加至返回结果 map.put(n2, 0); // 将n2的个数设置为0(避免重复计算) } return res; }
本题解法执行时间为33ms。
Runtime: 33 ms, faster than 25.00% of Java online submissions for Max Number of K-Sum Pairs.
Memory Usage: 97.1 MB, less than 25.00% of Java online submissions for Max Number of K-Sum Pairs.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1679-max-number-of-k-sum-pairs-解题思路分析/