给出一个1至N的排列,允许你做不超过K次操作,每次操作可以将相邻的两个数交换,问能够得到的字典序最大的排列是什么?
例如:N = 5, {1 2 3 4 5},k = 6,在6次交换后,能够得到的字典序最大的排列为{5 3 1 2 4}。
想法就是贪心,每次都选出数组未排好的最大值,放到首位,但这的前提是在k数够的情况下,怎么去限制k不够了,怎么交换。
这里一个重点就是j<Math.min(arr.length,k+i+1),每次选最大值的时候也要看k是否够,只选到可移动最大位置处截至,就不再看后面了
function move(arr,k){
for(let i=0;i<arr.length;i++){
let max=i;
for(let j=i+1;j<Math.min(arr.length,k+i+1);j++){
if(arr[j]>arr[max]){
max=j;
}
}
for(let j=max;j>i;j--){
let temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
if(k>max-i){
k-=max-i;
}else {
break;
}
}
return arr;
}