考研一段时间没写算法题,代码能力、思维能力真的是严重下降
现在开始每日一题,坚持博客,恢复下思维能力吧。
开始用Java写题目了,多熟悉下java
题目链接
思路
就是全排列嘛
题目的要求是要找给定全排列的后M个全排列
例如给定全排列 1 2 5 4 3 找后3个全排列
从后往前遍历,如果从i到N-1是单调递减的说明固定0~i-1无法找到比该全排列更大的全排列了。
如果ar[i-1] < ar[i] 则应找到最后一个比它大的元素来替换i-1,然后将i到N-1逆置
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int M = scanner.nextInt();
int ar[] = new int[N];
for(int i = 0; i < N; i++){
ar[i] = scanner.nextInt();
}
while(M-->0){
int i = N-1;
while(ar[i-1] > ar[i])
i--;
i--;
int j;
//找到最后一个比下标i元素大的
for(j=N-1; j > i; j--){
if(ar[j] > ar[i]){
break;
}
}
swap(ar,i,j);
i++;
j = N-1;
while(i<j){
swap(ar,i,j);
i++;
j--;
}
}
for(int i=0;i<N;i++){
System.out.print(ar[i]+" ");
}
return;
}
public static void swap(int ar[], int i, int j){
int temp = ar[i];
ar[i] = ar[j];
ar[j] = temp;
}
}