三步:
第一,将齐王的马和田忌的马按速度大小排序
第二、开始一一比较,田忌的马大,齐王的马和田忌的马都到下一匹,齐王的马等于田忌的或者比田忌的大,那就田忌到下一匹马,齐王还是这匹马,田忌的这匹马进垃圾箱(除去齐王已经匹配田忌的马,剩下齐王所有的马这匹马都竞争不过)
第三,找对应关系,排序前的齐王马和排序后的齐王马对应上,然后再对应上田忌的马
class Solution {
public int[] advantageCount(int[] nums1, int[] nums2) {
int [] garbage = new int [nums1.length];//垃圾箱,存放对比失败的马
int [] nums3 = new int [nums1.length];// 负责输出的数组前期用不到
int [][] res = new int [nums1.length][2];// 存放双方马的对应关系 res[i][0]存放田忌马,res[i][1]放齐王马
int [] nums4 = nums2.clone();//克隆一下,记录以前齐王马的排列顺序,以便于后边更好进行比较
Arrays.sort(nums1);// 0 1 2 2 4
Arrays.sort(nums2);// 0 0 1 2 3
int index1 = 0 ;
int indexGar = 0;//垃圾箱下表
int index3 = 0;
int indexRes = 0;
for(int i = 0;i<nums1.length;i++) {
if(nums1[index1]<=nums2[i]) {
garbage[indexGar] = nums1[index1];//比齐王的马垃圾,直接丢垃圾箱
indexGar++;// 下边增加
index1++;
i--;//下次把田忌的马换快一点的,还继续比较齐王的这批马nums2[i]
if(index1==nums1.length)//田忌没马比了,就跳出循环
break;
}
else {
// 比过齐王的马,就记录!!!
res[indexRes][0] = nums1[index1];//
res[indexRes][1] = nums2[i];//
indexRes++;
index1++;
index3++;//也是nums2内的元素
if(index1==nums1.length)
break;
}
}
indexGar = 0; //清零垃圾箱的下标
for(int i = index3;i<nums1.length;i++) {//把垃圾箱里的马倒出来,跟齐王的马匹配(反正必输!!!)
// index3-1是已经匹配完的马
res[indexRes][0]= garbage[indexGar];
res[indexRes][1] = nums2[i];
indexRes++;
indexGar++;
}
// 找对应关系,num4 正是对应原来齐王的排列顺序
for(int i =0;i<nums1.length;i++) {
for(int j =0;j<nums1.length;j++) {
if(res[i][1]==nums4[j])// 直接等于,这里不存在匹配错的问题,因为速度一样默认是同一个马
{
nums3[j] = res[i][0];
nums4[j] = -1;
break;
}
}
}
return nums3;
}
}
还是超时,欢迎有大佬提出改进意见,谢谢。
标签:田忌赛马,int,王马,用例,nums2,齐王,超时,nums1,田忌 From: https://blog.csdn.net/qq_62691586/article/details/144145625