持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。
分析
一道很简单的贪心算法题目。题目中已经给出了如何处理数据的样例。我们可以很容易地得出题目的要求:转动数组的数据,达到num1[i]>num2[i]的最大数量。 按照题目的要求,无外乎有以下两种情况:
- nums1 中的确有大于 nums2 数组中对应的数据,这个时候取大于nums2 数组的最小数据即可;
- nums1 中没有大于 nums2 数据中对对应的数据,这个时候取nums1中的最小值即可。 对于第2中情况,为什么要取最小值呢?因为只有取最小值时,进行后续判断时,才能够得到最符合其他数组的情况,
按照上述的逻辑,我们可以这么进行解答:
-
首先是保存nums1 中的数据,主要是用来后续判断。这里我们不妨使用 TreeSet。一方面方便存储,另一方面,TreeSet 有一些属于自己的函数,能够在接下来的过程中更好的支持判断。
-
遍历nums2 数组。接下来有以下情况:
-
首先判断有没有大于nums2 的数据,这个使用直接 TreeSet 的
higherKey()函数即可 -
如果存在,那么直接定义该值即可;
-
如果不存在,则取nums1 中的最小值;
-
如果取到的值存在于map中,那么就从map中删除该值;
-
否则,就在map中增加该值。用来处理数据
最后返回处理后的数组即可。
总结
这是一道典型的贪心算法题目。从逻辑上我判定它是一道easy题目。对于算法新人来说,只要理清逻辑,能够很快AC。除了文中的贪心算法外,还有其他的大佬也通过双指针等算法取解决。 这种思路也是很正确的。事实上,一道题目划分为哪个知识点,都是带有主观色彩的。在力扣中,你甚至能够暴力AC(当然前提是题目比较简单)。就看你当时想到了哪些知识点,并且能够真正解决问题。