给定长度为m的序列T,求一个长度为n且字典序列最小的排列,并且要求序列T为所求排列的子序列。题目保证这样的排序一定存在。

  • 给定长度为m的序列T,求一个长度为n且字典序列最小的排列,并且要求序列T为所求排列的子序列。题目保证这样的排序一定存在。
    输入:
    5 2 n为5 m为2
    4 2 T序列
    输出
    1 3 4 2 5

  • 思路:从1~n的数字中去除T序列包括的数字,则得到候选数组arr,将arr与T数组合并成一个数组。

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();  //所求序列的个数
        int m = sc.nextInt(); //T序列的个数
        int[] T = new int[m];
        int[] flag = new int[n];  //用于记录哪些数字已经有了
        for (int i = 0; i < m; i++) {  //输入T序列
            T[i] = sc.nextInt();
            flag[T[i]-1] =1;
        }
        int[] arr = new int[n-m];
        int k=0;
        //先找到1~n中要插入的数字
        for(int i=1;i<=n;i++){
            if(flag[i-1]!=1){  //注意-1,下标从0开始
                arr[k++]=i;
            }
        }
        int[] res = new int[n];
        int b=0;
        int i,j;
        for(i=0,j=0;i<k&&j<m;){
            if(arr[i]<T[j]){
                res[b++]=arr[i++]; //选择小的加入结果数组,并将指针后移
            }else{
                res[b++]=T[j++];
            }
        }
        while(i<k){  //arr数组还有剩余元素
            res[b++]=arr[i++];
        }
        while(j<m){  //T数组还有剩余元素
            res[b++]=T[j++];
        }
        System.out.println(Arrays.toString(res));
    }
}

你可能感兴趣的:(算法)