43 贪心算法 -第K个排列

2023-12-13 18:18:21

题 目 描 述

n ?个 字 共 有 n ! 种 排 列 。

给 定 参 数 n , 从 1 到 n 会 有 n 个 整 数 : 123

按 大 小 顺 升 序 列 出 所 有 排 列 的 情 况 ,

并 己 当 n = 3 时 ,

所 有 排 列 如 下 : “ 123 ” “ 132 ” “ 213 ” “ 231 ” “ 312 , “ 321 ”

给 定 n 和 k , 返 回 第 k 价 葬 列 。

输 入 描 述 ,

第 一 行 为 n ,

第 二 行 为 k , 给 定 n 的 范 围 是 [ 1 , 9 ] 给 定 k 的 范 围 是 [ 1 ,n 刂 。

输 出 描 述

输 出 排 在 k 位 首 的 数 字 。

import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
  static int[] fact;
 
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    int n = sc.nextInt();
    int k = sc.nextInt();
 
    fact = new int[n + 1];
    fact[1] = 1;
    for (int i = 2; i <= n; i++) {
      fact[i] = fact[i - 1] * i;
    }
 
    int[] arr = new int[n];
    for (int i = 0; i < n; i++) arr[i] = i + 1;
 
    System.out.println(getNK(n, k, arr));
  }
 
  public static String getNK(int n, int k, int[] arr) {
    if (n == 1) return "1";
 
    int f = fact[n - 1];
    int prefix = arr[(k - 1) / f];
    k %= f;
    k = k == 0 ? f : k;
 
    arr = Arrays.stream(arr).filter(ele -> ele != prefix).toArray();
 
    if (k == 1) {
      StringBuilder sb = new StringBuilder();
      for (int v : arr) sb.append(v);
      return prefix + sb.toString();
    } else {
      return prefix + getNK(n - 1, k, arr);
    }
  }
}

文章来源:https://blog.csdn.net/u012545581/article/details/134975043
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。