力扣每日一题(优势洗牌)

在这里插入图片描述

思路

题目的意思是田忌赛马,就是在nums1中选择比其大的最小数,若不存在这样的数字,则选择nums1中的最小值,用nums1的最小值比nums2的最小值,如果nums1的最小值比nums2的最小值大,就取nums1的最小值,如果小,否则就取用最小值去比nums2的最大值

输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]
先把nums1排序变成8,12,24,32,再排序nums2,只排序下标为3,0,1,2,
初始化左指针为0指向nums2最小值,右指针为3
开始比较,8比11小,就用最差的马比最强的马,把8放到32的位置,右指针减1,变成2,此时结果数组为
【0,0,8,0】
12比11大,取当前马就行,然后就把12放到11的位置,左指针加1,变成1,此时结果数组为
【0,0,8,12】
24比13大,取当前马就行,然后就把24放到13的位置,左指针加1,变成2,此时结果数组为
【24,0,8,12】
32比25大,取当前马就行,然后就把32放到25的位置,左指针加1,变成3,此时结果数组为
【24,32,8,12】

\

代码实现

public int[] advantageCount(int[] nums1, int[] nums2) {
        int length = nums1.length;
        int[] res = new int[length];
        Arrays.sort(nums1);
        Integer[] ids = IntStream.range(0, length).boxed().toArray(Integer[]::new);
        // 排序nums2,ids[0]是nums2最小值的下标
        Arrays.sort(ids, Comparator.comparingInt(i -> nums2[i]));
        // 双指针
        int left = 0, right = length - 1;
        for (int n : nums1) {
            // nums1最小值是否比nums2最小值大,是的话则取nums1,否的话就取nums2最大值
            // 如果nums1最小值比nums2中的最小值大,则本次res中nums1对应的下标为index[left],然后left++
            // 否则本次res中nums1对应的下标为index[right],然后right--,用最差马比最强马
            res[n > nums2[ids[left]] ? ids[left++] : ids[right--]] = n;
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值