刷完LeetCode题库——870. 优势洗牌

84 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

题目详情

LeetCode题库序号 870. 优势洗牌 ,难度为 中等

Tag : 「双指针」,「排序」,「贪心」 给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 nums 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。

返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。

示例 1:

输入: nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出: [2,11,7,15]

示例 2:

输入: nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出: [24,32,8,12]

提示:

  • 1 <= nums1.length <= 105
  • nums2.length == nums1.length
  • 0 <= nums1[i], nums2[i] <= 109

双指针+排序+贪心

题解思路: 我们需要积累优势,那么就需要用最小化的元素去获取一个优势点,这里面运用了贪心的机制,先将两个数组分别进行排序,不需要把真正的原数组进行排序,只需要把数组的索引进行排序,确定左右的两个节点,然后进行遍历,即可获得答案的数组,题目解法详情见以下代码:

题解代码

class Solution {
    public int[] advantageCount(int[] nums1, int[] nums2) {
        
        int len = nums1.length;
        Integer[] nums1Index = new Integer[len];
        Integer[] nums2Index = new Integer[len];
        
        for (int i = 0; i < len; i++) {
            nums1Index[i] = i;
            nums2Index[i] = i;
        }

        Arrays.sort(nums1Index, (i, j) -> nums1[i] - nums1[j]);
        Arrays.sort(nums2Index, (i, j) -> nums2[i] - nums2[j]);

        int[] ans = new int[len];
        int left = 0;
        int right = len - 1;
        for (int i = 0; i < len; i++) {
            if (nums1[nums1Index[i]] > nums2[nums2Index[left]]) {
                ans[nums2Index[left]] = nums1[nums1Index[i]];
                left++;
            } else {
                ans[nums2Index[right]] = nums1[nums1Index[i]];
                right--;
            }
        }

        return ans;
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.870. 优势洗牌 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…