【每日一题】leetcode-870.优势洗牌

【每日一道算法题系列】

地址:leetcode链接

思路:

        主要考察的是贪心算法,使用局部的最优解作为全局的最优解

        此题可以参考田忌赛马:

        A与B按照从小到大的顺序比较(下等马/中等马/上等马的顺序),A如果比得过B,那么就是优势

        如果比不过B,那么就用A当前最劣的那匹马,去拼掉B最好的那匹马

注意:

        1 数组的排序,是根据数组元素的大小,然后对数组坐标进行排序

        2 注意left与right两个指针的具体含义,代表的是num2中的最大最小值

   public int[] advantageCount(int[] nums1, int[] nums2) {
      int n = nums1.length;

      //定义两个排序数组
      Integer[] sortNums1 = new Integer[n];
      Integer[] sortNums2 = new Integer[n];

      //对两个数组的序号,进行初始化
      for(int i = 0; i < n; i++) {
         sortNums1[i] = i;
         sortNums1[i] = i;
      }

      //按照从小到大的顺序进行排序
      Arrays.sort(sortNums1, (i, j) -> nums1[i] - nums1[j]);
      Arrays.sort(sortNums2, (i, j) -> nums2[i] - nums2[j]);

      int[] ans = new int[n];
      int left = 0, right = n - 1;

      //田忌赛马原则
      //两个数组排序后,按照排好的顺序进行遍历比较
      //如果nums1数组的遍历的当前元素比nums2中最左侧的元素大
      //那么久增加nums1的一点优势
      //如果nums1数组的遍历的当前元素比nums2中最左侧的元素小
      //那么说明,nums1中遍历的当前元素,没有比nums2中再大的元素了
      //根据田忌赛马原则,nums1中的这个元素是下等马,那就有nums1下等马干掉nums2中的上等马,也就是nums2中最大的元素
      for(int i = 0; i < n; i++) {
         if(nums1[sortNums1[i]] > nums2[sortNums2[left]]) {
            ans[sortNums2[left]] = nums1[sortNums1[i]];
            left++;
         }
         else {
            ans[sortNums2[right]] = nums1[sortNums1[i]];
            right--;
         }
      }

      return ans;
   }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值