力扣热门算法题 59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表

news2024/9/22 15:43:16

59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.21 可通过leetcode所有测试用例。

目录

59. 螺旋矩阵 II

解题思路

完整代码

Java

Python

60. 排列序列

解题思路

完整代码

Java

Python

61. 旋转链表

解题思路

解题思路:

完整代码

Java

Python


59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

解题思路

完整代码

Java
public class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int num = 1;
        int top = 0, bottom = n - 1, left = 0, right = n - 1;
        
        while (left <= right && top <= bottom) {
            for (int i = left; i <= right; i++) {
                matrix[top][i] = num++;
            }
            top++;
            
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = num++;
            }
            right--;
            
            for (int i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;
            
            for (int i = bottom; i >= top; i--) {
                matrix[i][left] = num++;
            }
            left++;
        }
        
        return matrix;
    }
}
Python
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        if n == 1:
            return [[1]]
        
        matrix = [[0] * n for _ in range(n)]
        num, top, bottom, left, right = 1, 0, n - 1, 0, n - 1
        
        while left <= right and top <= bottom:
            for i in range(left, right + 1):
                matrix[top][i] = num
                num += 1
            top += 1
            
            for i in range(top, bottom + 1):
                matrix[i][right] = num
                num += 1
            right -= 1
            
            for i in range(right, left - 1, -1):
                matrix[bottom][i] = num
                num += 1
            bottom -= 1
            
            for i in range(bottom, top - 1, -1):
                matrix[i][left] = num
                num += 1
            left += 1
            
        return matrix

60. 排列序列

给出集合 [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. 初始化:创建一个列表 numbers 存储从 1 到 n 的所有数字,用于构造排列。同时,计算 (n-1)!(记为 factorial),因为在固定第一个数字的情况下,后面的数字可以形成 (n-1)! 种排列。

  2. 调整 k:由于列表的索引从 0 开始,但排列是从 1 开始计数的,所以先将 k 减去 1,以便与索引对齐。

  3. 构造排列:遍历从 0 到 n-1 的每个位置,对于每个位置:

    • 确定该位置上的数字应该是 numbers 中的哪一个。这可以通过将 k 除以当前的 factorial 值得到。这会给出当前位置应该使用 numbers 中的哪个数字。
    • 更新 k 为 k 除以 factorial 的余数,为下一个位置的计算做准备。
    • 更新 factorialfactorial 除以当前的剩余数字的数量,因为每确定一个数字后,剩余可选数字就减少一个。
    • numbers 中移除已经使用过的数字,确保不会重复使用。
  4. 返回结果:将步骤 3 中确定的数字连接起来,形成字符串作为最终答案。

完整代码

Java
public class Solution {
    public String getPermutation(int n, int k) {
        List<Integer> numbers = new ArrayList<>();
        int factorial = 1;
        for (int i = 1; i <= n; i++) {
            numbers.add(i);
            factorial *= i;
        }
        k--;  // 将 k 转换为基于 0 的索引
        
        StringBuilder answer = new StringBuilder();
        for (int i = 0; i < n; i++) {
            factorial /= (n - i);
            int index = k / factorial;
            k %= factorial;
            
            answer.append(numbers.get(index));
            numbers.remove(index);
        }
        
        return answer.toString();
    }
}
Python
class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        numbers = list(range(1, n+1))
        factorial = 1
        for i in range(1, n):
            factorial *= i
        k -= 1  # 将 k 转换为基于 0 的索引
        
        answer = []
        for i in range(n-1, -1, -1):
            index = k // factorial
            k %= factorial
            if i != 0:
                factorial //= i
            answer.append(str(numbers[index]))
            numbers.pop(index)
            
        return ''.join(answer)

61. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100

解题思路

旋转链表意味着将链表的后部分移动到链表的前部分。为了实现这一点,我们可以遵循以下步骤:

解题思路:

  1. 链表长度和尾节点:首先遍历链表以确定链表的长度 n,并在此过程中获得链表的尾节点。这一步骤有助于我们理解需要移动多少个节点以及如何连接链表的尾部到头部。

  2. 计算实际移动次数:由于链表的长度是固定的,如果移动次数 k 大于链表长度 n,那么移动 k 次实际上等同于移动 k % n 次(因为每移动 n 次,链表就会恢复到原始状态)。因此,我们只需要移动 k % n 次。

  3. 找到新的头节点:新的头节点将是从链表尾部数起的第 k % n 个节点的下一个节点。因此,我们需要从头节点开始,移动 (n - k % n - 1) 次来找到新的尾节点。

  4. 执行旋转:将当前的尾节点(新的尾节点)的 next 指针指向原来的头节点,将原来的尾节点的 next 指针指向 null,并更新头节点为新的头节点。

完整代码

Java
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null || head.next == null || k == 0) return head;
        
        // 计算链表长度并获取尾节点
        int length = 1;
        ListNode tail = head;
        while (tail.next != null) {
            tail = tail.next;
            length++;
        }
        
        // 计算需要移动的实际次数
        k = k % length;
        if (k == 0) return head;
        
        // 找到新的尾节点
        ListNode newTail = head;
        for (int i = 0; i < length - k - 1; i++) {
            newTail = newTail.next;
        }
        
        // 执行旋转
        ListNode newHead = newTail.next;
        newTail.next = null;
        tail.next = head;
        
        return newHead;
    }
}
Python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head or not head.next or k == 0:
            return head
        
        # 计算链表长度并获取尾节点
        length, tail = 1, head
        while tail.next:
            tail = tail.next
            length += 1
        
        # 计算需要移动的实际次数
        k = k % length
        if k == 0:
            return head
        
        # 找到新的尾节点
        new_tail = head
        for _ in range(length - k - 1):
            new_tail = new_tail.next
        
        # 执行旋转
        new_head = new_tail.next
        new_tail.next = None
        tail.next = head
        
        return new_head

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯:模拟、枚举

目录 引言一、修剪灌木二、特殊年份三、刷题统计四、日期问题五、六、七、八、九、 引言 本篇文章主要介绍蓝桥杯的模拟和枚举的题目&#xff0c;这种题在 B B B 组还是比较简单的&#xff0c;后续也会一直往里加新的真题&#xff0c;加油&#xff01; 一、修剪灌木 标签&am…

蓝桥杯算法练习系统—金属采集(树形dp)

问题描述 人类在火星上发现了一种新的金属&#xff01;这些金属分布在一些奇怪的地方&#xff0c;不妨叫它节点好了。一些节点之间有道路相连&#xff0c;所有的节点和道路形成了一棵树。一共有 n 个节点&#xff0c;这些节点被编号为 1~n 。人类将 k 个机器人送上了火星&…

消息队列—RabbitMQ如何保证消息可靠性?

1. 如何保证消息的可靠性&#xff1f; 先来看看我们的万年老图&#xff0c;从图上我们大概可以看出来一个消息会经历四个节点&#xff0c;只有保证这四个节点的可靠性才能保证整个系统的可靠性。 生产者发出后保证到达了MQ。MQ收到消息保证分发到了消息对应的Exchange。Exchan…

网络基础(一)初识

1、计算机网络背景 1.1、网络发展 1. 独立模式: 计算机之间相互独立&#xff1b; 2. 网络互联: 多台计算机连接在一起&#xff0c;完成数据共享&#xff1b; 3. 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 4. 广域网WAN: 将远隔千里的计算机都连在一起;…

vue3 报错 require is not defined

问题 require is not defined 原因 vite 不支持require的用法&#xff0c; webpack是支持的 解决 方法一&#xff1a; 更改vite使用语法 vite官网 方法二 安装转换插件vite-plugin-require-transform 仓库地址 参考 关于Vite不能使用require问题 方法二Vite 踩坑 —— …

PCL点云处理之最小中值平方(Lmeds法)拟合平面(二百三十四)

PCL点云处理之 最小中值平方法(Lmeds)拟合平面(二百三十四) 一、算法介绍一、拟合原理二、具体实现1.代码2.结果一、算法介绍 (本文提供详细注释,输出拟合平面参数和平面点云) Lmeds(Least Median of Squares)是一种统计学方法,用于拟合数据并减少异常值对拟合结果…

MySQL索引(图文并茂)

目录 一、索引的概念 二、索引的作用 三、创建索引的原则依据 四、索引的分类和创建 1、索引的分类 2、索引的创建 2.1 普通索引 2.1.1 直接创建索引 2.1.2 修改表方式创建 2.1.3 创建表的时候指定索引 2.2 唯一索引 2.2.1 直接创建唯一索引 2.2.2 修改表方式创建 …

百度小程序入口在哪里找到怎么打开百度词令关键词口令直达小程序?

百度小程序入口在哪里找到怎么打开百度词令关键词口令直达小程序&#xff1f; 一、百度搜索找到百度词令小程序 打开手机百度搜索「词令」即可找到百度词令关键词口令直达小程序&#xff1b; 二、百度小程序中心找到百度小程序 2.1、打开手机百度&#xff0c;点击底部我的&a…

SW工具下没有URDF

解决方案&#xff0c;下载

使用Docker搭建YesPlayMusic网易云音乐播放器并发布至公网访问

目录 ⛳️推荐 1. 安装Docker 2. 本地安装部署YesPlayMusic 3. 部署公有云YesPlayMusic播放器 3.1 安装cpolar内网穿透 3.2 固定YesPlayMusic公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一…

结构数列递推式的一组严格解

假设一个6*6的平面&#xff0c;这个平面的行和列可以自由的变换。有4点的数列排列为 通过结构加法&#xff0c;在4点和5点结构数列之间变换&#xff0c;迭代10次。 4点数列的顺序为 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 4-1 1 3 2 12 5 6 8 4 …

00后的AI创业风口,优牛企讯揭秘

随着人工智能技术的迅猛发展&#xff0c;AI已经成为创业的新风口&#xff0c;吸引了众多00后年轻人的目光。 他们以敏锐的市场嗅觉和创新精神&#xff0c;积极投身于这片充满无限可能的领域。 在这样一个竞争激烈的背景下&#xff0c;优牛企讯这款企业动态信息监控产品应运而…

三星工厂突发大火···  | 百能云芯

据韩媒报道&#xff0c;三星SDI位于韩国京畿道龙仁市基兴区的器兴工厂发生火灾。火灾发生在当地时间周四下午15:37左右&#xff0c;持续约20分钟后被扑灭。 幸运的是&#xff0c;此次火灾并未造成人员伤亡&#xff0c;但火场附近的一些帐篷已经被烧毁。消防部门目前正在调查火灾…

探索人工智能基础:从概念到应用【文末送书-42】

文章目录 人工智能概念人工智能基础【文末送书-42】 人工智能概念 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;作为当今科技领域的热门话题&#xff0c;已经深刻地影响着我们的生活和工作。但是&#xff0c;要理解人工智能&#xff0c;我们首先需…

Elastic 被评为 2024 年 Fast Company 最具创新力的公司

近期&#xff0c;Elastic 被《Fast Company》杂志评为 2024 年最具创新力的公司。《Fast Company》认为&#xff1a;作为企业搜索提供商的 Elastic&#xff0c;已将人工智能纳入其技术套件中&#xff0c;以帮助企业快速查找和分析相关企业数据。 这对 Elastic 是一个巨大的荣誉…

一文搞懂Java动态代理:为什么Mybatis Mapper不需要实现类?

在学习Java动态代理之前&#xff0c;我想让大家先思考这样几个问题。 JDK动态代理为什么不能对类进行代理&#xff1f;Mybatis Mapper接口为什么不需要实现类&#xff1f; 如果你还不知道上述问题的答案&#xff0c;那么这篇文章一定能消除你心中的疑惑。喜欢“IT果果日记”文…

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的…

多线程libtorch推理问题

一、环境 我出问题的测试环境如下: pytorch1.10+cu113 pytorch1.10+cu116 pytorch2.2+cu118 libtorch1.10.1+cu113 libtorch1.10.1+cu111 libtorch1.9.0+cu111 二、问题现象 最近封装libtorch的推理为多线程推理的时候,遇到一个现象如下: (1)只要是将模型初始化放到一个…

[项目前置]如何用webbench进行压力测试

测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具&#xff0c;它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容&#xff1a; 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是&#xff0c;创建指定数…

14029.ZYNQMP的zcu102官方评估板SD卡资料

文章目录 1 ZCU SD 卡资料链接2 设备树反汇编提取资料1 ZCU SD 卡资料链接 https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/135364615/2019.1+Release 2 设备树反汇编提取资料 /dts-v1/;/ {compatible <