java leetcode之[数据结构 中等]870. 优势洗牌

这篇博客主要解析了LeetCode中的「优势洗牌」问题,通过使用双层循环实现找到最大优势的数组排列。首先对数组A进行排序,然后遍历数组B,寻找比B中元素大的A中的元素并进行替换,最后处理未被赋值的元素。这种方法有效地解决了题目要求的最大优势问题。
摘要由CSDN通过智能技术生成

题目的链接在这里:https://leetcode-cn.com/problems/advantage-shuffle/


题目大意

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。

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


一、示意图

在这里插入图片描述

二、解题思路

for循环系列

for循环系列

代码如下:

class Solution {
     public  int[] advantageCount(int[] nums1, int[] nums2) {
        //这道题的关键还是选取什么数据结构
        //那就试试看 找最近且最大的数
        //先把A进行排序
        //进行一些边界判断
        if(nums1.length==0)
            return null;
        if(nums1.length==1&&nums1[0]>nums2[0]){
            return nums1;
        }
        Arrays.sort(nums1);
        int result[]=new int[nums1.length];
        //然后就是如果把这个值修改过了 就被这个值设置为一个不会被改正的值
        //这里就直接做两次for循环
        //count用来判断有没有全部赋值
        int count=0;
        for(int i=0;i<nums1.length;i++)
            for(int j=0;j<nums2.length;j++){
                //这里就进行判断并且判断成功的话 就需要赋初值
                if(nums1[i]>nums2[j]&&nums1[i]!=Integer.MAX_VALUE&&nums2[j]!=Integer.MAX_VALUE){
                    //说明这个是最近并且可以放发
                    result[j]=nums1[i];
                    //再进行更新
                    count++;
                    nums1[i]=Integer.MAX_VALUE;
                    //好像nums2也不需要改变了
                    nums2[j]=Integer.MAX_VALUE;
                    break;
                }
            }
        //这里就是可能会出现没有全都赋值的情况
        if(count!=nums1.length){
            //那就进行随意赋值?
            //比如比较了两次 刚好count是第三个
            for(int i=0;i<nums1.length;i++){
                if(result[i]==0) {
                    //只有他等于0说明需要存在补足 才需要进行判断
                    for (int j = 0; j < nums1.length; j++) {
                        if (nums1[j] != Integer.MAX_VALUE) {
                            //这里就要进行修改了
                            result[i]=nums1[j];
                            nums1[j]=Integer.MAX_VALUE;
                            break;
                        }
                    }
                }
            }
        }
        return result;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值