首页 > 其他分享 >LeetCode题练习与总结:排列序列--60

LeetCode题练习与总结:排列序列--60

时间:2024-04-09 19:30:24浏览次数:25  
标签:排列 nums -- 复杂度 列表 60 int 字符串 LeetCode

一、题目描述

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 n 和 k,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

示例 3:

输入:n = 3, k = 1
输出:"123"

提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

二、解题思路

  1. 创建一个列表 nums,其中包含从 1 到 n 的所有数字。
  2. 计算 (n-1)! 的值,因为这是每个数字开头的排列数量。
  3. 从 k-1(因为我们的列表是从 0 开始的)中减去 (n-1)! 的整数倍,得到剩余的值 offset
  4. offset / (n-2)! 将给出当前位的数字在 nums 中的索引。
  5. 使用该索引从 nums 中获取数字,并将其添加到结果字符串中。
  6. 从 nums 中移除该数字。
  7. 重复步骤 2-6,直到找到第 k 个排列。

三、具体代码

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public String getPermutation(int n, int k) {
        // Step 1: 创建一个列表 nums,其中包含从 1 到 n 的所有数字
        List<Integer> nums = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            nums.add(i);
        }

        // 计算 (n-1)!
        int fact = 1;
        for (int i = 1; i <= n - 1; i++) {
            fact *= i;
        }

        // 从 k-1 中减去 (n-1)! 的整数倍
        k--;

        StringBuilder result = new StringBuilder();

        // 重复步骤 2-6,直到找到第 k 个排列
        for (int i = n; i >= 1; i--) {
            // 计算 offset
            int index = k / fact;
            k %= fact;

            // Step 4: 使用该索引从 nums 中获取数字,并将其添加到结果字符串中
            result.append(nums.get(index));

            // Step 6: 从 nums 中移除该数字
            nums.remove(index);

            // 更新 (n-1)!
            if (i > 1) {
                fact /= (i - 1);
            }
        }

        return result.toString();
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 初始化列表 nums 的时间复杂度是 O(n),因为需要遍历从 1 到 n 的所有数字。
  • 计算 (n-1)! 的时间复杂度是 O(n),因为需要循环 n-1 次。
  • 主循环中,每次迭代都会从列表 nums 中移除一个元素,并且更新 (n-1)! 的值。这个循环会执行 n 次,每次操作的时间复杂度是 O(1),因为列表 nums 的长度在不断减少,而且更新 (n-1)! 的值是常数时间操作。
  • 因此,总的时间复杂度是 O(n) + O(n) + O(n) * O(1) = O(n)。
2. 空间复杂度
  • 需要一个列表 nums 来存储从 1 到 n 的所有数字,因此空间复杂度是 O(n)。
  • 需要一个 StringBuilder 来构建结果字符串,其空间复杂度也是 O(n)。
  • 其他变量(如 fact 和 index)使用的空间是常数的,因此可以忽略不计。
  • 因此,总的空间复杂度是 O(n) + O(n) = O(n)。

五、总结知识点

1. 数据结构:

  • ArrayList: 是Java集合框架中的一部分,用于存储动态数组。它允许我们存储和操作可变大小的元素集合。

2. 循环结构:

  • for 循环: 用于初始化列表 nums 和计算 (n-1)!。这是Java中常用的控制流语句,用于重复执行一段代码固定的次数。

3. 算术运算:

  • 幂运算和阶乘: 代码中通过循环计算 (n-1)!,这是基础的数学运算在编程中的体现。

4. 字符串操作:

  • StringBuilder: 用于构建和修改字符串。由于字符串是不可变的,使用 StringBuilder 可以提高频繁修改字符串时的性能。

5. 算法思想:

  • 排列组合: 代码的核心是找到一个给定序列的第k个排列。这涉及到排列组合的数学概念,以及如何通过计算来找到特定的排列。

6. 列表操作:

  • remove(int index): 用于从列表中移除指定位置的元素。这是对列表进行动态修改的常见操作。

7. 变量和类型:

  • int: 是Java中的基本数据类型之一,用于表示整数。
  • StringBuilder: 是一个类,用于表示可变的字符序列。

8. 函数和方法:

  • public String getPermutation(int n, int k): 这是一个公共方法,接受两个整数参数 n 和 k,并返回一个字符串。这是面向对象编程中封装和抽象的体现。

9. 递归和迭代:

  • 虽然这段代码没有直接使用递归,但是它使用了迭代的方式来逐步构建最终的排列字符串。

10. 边界条件处理:

  • 当 k 减去 (n-1)! 的整数倍后剩余为0时,直接取列表中的最后一个元素,这是对边界条件的处理。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:排列,nums,--,复杂度,列表,60,int,字符串,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/137061411

相关文章

  • 关于“雪”的文章
    雪花翩翩起舞,宛如仙羽飘洒,悠然坠落尘寰间。天地一片苍茫,恰似银装素裹之仙境展现。 大地尽披素洁之裳,清雅绝伦,美不胜收。山川旷野,皆被皑皑白雪覆盖,静谧祥和之气弥漫。绵延山峦,宛如沉睡巨龙,默默守护此片宁静;广袤田野,于雪之映衬下,恰似宏伟水墨画卷,素雅而灵动非凡。 树枝挂满......
  • 你应该知道的21个html小技巧
    本文翻译自21HTMLTipsYouMustKnowAbout,作者:Shefali,略有删改。在这篇文章中,我将分享21个HTML技巧和代码片段,可以提高你的编码技能。链接联系人使用HTML创建可点击的电子邮件、电话和短信链接:<!--Emaillink--><ahref="mailto:[email protected]">SendEmai......
  • 用Vue全家桶手工搓了一个类似抖音短视频的软件,全开源
    用Vue全家桶手工搓了一个类似抖音短视频的软件,全开源软件简介用Vue全家桶手工搓了一个高仿抖音,全开源PC浏览器请用手机模式访问。先按F12调出控制台,再按Ctrl+Shift+M切换到手机模式,手机请用Via浏览器或者Chrome浏览器预览。其他浏览器会强制将视频全屏,导致样式都失效。......
  • 企业怎样申请SSL证书?
    企业怎样申请SSL证书?对于很多企业而言,使用SSL证书加密网站已经显得尤为重要,这不仅仅是关乎企业的网站安全,同时也关系着企业的形象以及用户的信赖。既然使用https协议已经众多企业认可,那么我们该如何给自己的网站申请以及安装SSL证书?一般来说,企业网站使用SSL证书需要经过选......
  • mc模组制作 4.方块与blockbench
    点击再点“b”就可以创建方块啦对于方块模型……如果是正正方方的那种,就选Normal,但如果要做一些不规则的,那就要用到了。(下载:https://github.com/JannisX11/blockbench/releases/download/v4.9.4/Blockbench_4.9.4.exe)打开以后点“创建新模型”新手只用填“文件名”就行......
  • 输入输出
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacex180821汪敏{classProgram{staticvoidMain(string[]args){/*floata=15.6f,b=87.7f;\Stringt;......
  • C#计算
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacex180821汪敏{classProgram{staticvoidMain(string[]args){//输出Console.WriteLine("书店管理销售系统>客户信......
  • C#字符拼接
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacex180821汪敏{classProgram{staticvoidMain(string[]args){/*Console.WriteLine("请输入您的姓名,性别和c#成绩");......
  • C#判断
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace课堂{classProgram{staticvoidMain(string[]args){/*//变量的定义intnum;//strin......
  • Web Audio API 第4章 音调与频域
    音调与频域此章中如果对音乐部分不感兴趣,可忽略代码部分也没有更多的新api,重要的还是相关的物理与声音的相关知识到目前为止我们已经学过了声音的基础属性:定时与音量。为了能处理更复杂的的情况,例如声音的均衡(比如,增加低音和降低高音),我们需要更复杂的工具。此章节将介绍......