【算法】【贪心算法】【leetcode】870. 优势洗牌

题目地址:https://leetcode.cn/problems/advantage-shuffle/description/

题目描述:

给定两个长度相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 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 <= 10^5

nums2.length == nums1.length

0 <= nums1[i] ,nums2[i] <= 10^9

解题思路(典型贪心算法)

田忌赛马的故事大家应该都听说过: 田忌和齐王赛马,两人的马分上中下三等,如果同等级的马对应着比赛,田忌赢不了齐王。但是田忌遇到了孙膑,

孙膑就教他用自己的下等马对齐王的上等马,再用自己的上等马对齐王的中等马,最后用自己的中等马对齐王的下等马,结果三局两胜,田忌赢了。

田忌赛马的核心思路就是打得过就打,打不过就拿自己的垃圾和对方的精锐互换。

把nums1当成是田忌的马,nums2当成是齐威王的马。 讨论田忌的下等马(nums的最小值):

  • 如果它能比过齐威王的下等马(nums的最小值),那这一分田忌直接拿下;

  • 如果它比不过齐威王的下等马,则用田忌的下等马比齐威王的上等马(mums2的最大值)。

去掉这两匹马,问题变成一个规模更小(n-1)的子问题。重复上述过程,即得到了所有马的对应 关系。

代码实现时,由于num2不能排序,我们可以创建一个下标数组ids,对ids排序,即ids[0]对应

nums2中最小值的下标,ids[1]对应num2中第二小值的下标。用双指针操作ids,从而知道

每个下标所要对应的nums1的元素,也就找到了所要求的nums1的排列。

解题思路来自:(灵茶山艾府)https://leetcode.cn/problems/advantage-shuffle/solutions/1/tian-ji-sai-ma-by-endlesscheng-yxm6/

代码实现

java 复制代码
public class Solution{
	 public int[] advantageCount(int[] nums1, int[] nums2) {
        //先对nums1进行排序
        Arrays.sort(nums1);

		//对muns2排序 但是mums2不能直接排序 需要额外借助一个数据排序
		int nums2Len = nums2.length;
		int [] ids = new int [nums2Len];
		
		//记录nums2的下标
		for(int i =0;i<n;i++){
			ids[i]=i;
		}

		//将num2进行排序 注意这里不能直接对nums2排序 转对nums2的下标排序代替nums2的顺序
		//升序排列 (降序也是一个样)
		Arrays.sort(ids,(i,j)->nums2[i]-nums2[j]);

		//赛马:打得过就打,打不过就拿自己的垃圾和对方的精锐互换
		int [] ans = new int[nums1.length];
		int right = nums2Len;
		int left = 0;
		for (int x : nums1) {
          ans[x > nums2[ids[left]] ? ids[left++] : ids[right--]] = x;
        }
	return ans;
    }
}
相关推荐
地平线开发者33 分钟前
mul 与 reduce_sum 的优化实例
算法·自动驾驶
坚持编程的菜鸟1 小时前
LeetCode每日一题——Pow(x, n)
c语言·算法·leetcode
csdn_aspnet1 小时前
分享MATLAB在数据分析与科学计算中的高效算法案例
算法·matlab·数据分析
白云千载尽1 小时前
moveit使用和机器人模型与状态--正向运动学和逆向运动学分析(四)
算法·机器人·逆运动学·moveit·正向运动学
我想吃余1 小时前
【0基础学算法】前缀和刷题日志(三):连续数组、矩阵区域和
算法·矩阵·哈希算法
面试鸭2 小时前
影石开奖,有点香
计算机·职场和发展·互联网
2501_938773992 小时前
文档搜索引擎搜索模块迭代:从基础检索到智能语义匹配升级
人工智能·算法·搜索引擎
CS创新实验室2 小时前
典型算法题解:长度最小的子数组
数据结构·c++·算法·考研408
我有一些感想……2 小时前
浅谈 BSGS(Baby-Step Giant-Step 大步小步)算法
c++·算法·数论·离散对数·bsgs
麦麦大数据2 小时前
F042 A星算法课程推荐(A*算法) | 课程知识图谱|课程推荐vue+flask+neo4j B/S架构前后端分离|课程知识图谱构造
vue.js·算法·知识图谱·neo4j·a星算法·路径推荐·课程推荐