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

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 - 1while left <= right and top <= bottom:for i in range(left, right + 1):matrix[top][i] = numnum += 1top += 1for i in range(top, bottom + 1):matrix[i][right] = numnum += 1right -= 1for i in range(right, left - 1, -1):matrix[bottom][i] = numnum += 1bottom -= 1for i in range(bottom, top - 1, -1):matrix[i][left] = numnum += 1left += 1return 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 = 1for i in range(1, n):factorial *= ik -= 1  # 将 k 转换为基于 0 的索引answer = []for i in range(n-1, -1, -1):index = k // factorialk %= factorialif i != 0:factorial //= ianswer.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, headwhile tail.next:tail = tail.nextlength += 1# 计算需要移动的实际次数k = k % lengthif k == 0:return head# 找到新的尾节点new_tail = headfor _ in range(length - k - 1):new_tail = new_tail.next# 执行旋转new_head = new_tail.nextnew_tail.next = Nonetail.next = headreturn new_head

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

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

相关文章

IDEA 2021.3.3最新激活破解教程(可激活至2099年,亲测有效)

下载地址&#xff1a;https://files.cnblogs.com/files/smallfa/ja-netfilter-all.rar?t1684636896&downloadtruehttps://files.cnblogs.com/files/smallfa/ja-netfilter-all.rar?t1684636896&downloadtrue1.Windows 系统下载解压到文件夹内&#xff0c;点击运行 ins…

就业班 2401--3.13 走进网络

走进网络 长风破浪会有时&#xff0c;直挂云帆济沧海。 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串…

学点儿Java_Day6_面向对象:类、封装、构造方法

1 类 1.1 定义 类&#xff1a;对现实世界中事物的抽象。Student 对象&#xff1a;现实世界中具体的个体。张三、李四 这些具体的学生 面向对象的特征&#xff1a;抽象、封装、继承、多态 OOP: Object Oriented Programming 类和对象的总结&#xff1a; 1、现实世界都是由很多…

JAVA多线程之JMM

文章目录 1. Java内存模型2. 内存交互3. 三大特性3.1 可见性3.1.1 可见性问题3.1.2 原因3.1.3 解决方法 3.2 原子性3.3 有序性 在继续学习JUC之前&#xff0c;我们现在这里介绍一下Java内存模型&#xff0c;也就是JMM&#xff0c;进而引出关键字volatile的使用条件。 1. Java内…

相机的内外参数标定和畸变矫正原理和代码

相机的成像过程实质上是坐标系转换。首先空间中的点坐标由世界坐标系转换到相机坐标系&#xff0c;然后将其投影到成像平面&#xff08;图像物理坐标系&#xff09;&#xff0c;最后再将成像平面上的数据转换到图像像素坐标系。但是由于透镜制造精度及组装工艺的差别会引入畸变…

【SQL】1251. 平均售价(IFNULL函数)

前述 知识点回顾&#xff1a;MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用 题目描述 leetcode题目&#xff1a;1251. 平均售价 Code select P.product_id,ifnull(round(sum(units * price) / sum(units), 2), 0) as average_price from Prices P left join UnitsS…

无痕消除笔APP好用吗?3款超实用软件分享

无痕消除笔APP好用吗&#xff1f;在日常生活中&#xff0c;无痕消除笔APP的便捷性不言而喻。无论是想要去除照片中的小瑕疵&#xff0c;还是快速修正文案中的错别字&#xff0c;这款工具都能迅速而精准地满足需求。它不仅提升了我们处理图片和文本的效率&#xff0c;还让我们的…

一个Flash编程错误标志的探析

1、问题描述 客户项目中使用的 MCU 型号是 STM32G0B1, 他们反馈在代码中尝试擦除并编程 FLASH时, 发现 FLASH 的状态寄存器显示编程错误(如图 1 所示). 问题是当前代码还没有开始擦除和编程, 怎么就有了编程错误标志了呢 ? 如果不将此错误标志清除, 后续的编程操作无法继续.客…

vue2 table 页面 + 功能 展示

首页代码 <!-- 首页展示页面 弹框展示 --> <template><div style><el-button type"text" size"small" click"dailys()">测试跳转</el-button><!-- <div class"dingwei"><a href"#…

【办公类-16-07-07】“2023下学期 大班户外游戏2(有场地和无场地版,每天不同场地)”(python 排班表系列)

作品展示 背景需求&#xff1a; 2024年2月教务组发放的是“每周五天内容相同&#xff0c;两周10天内容相同”的户外游戏安排 【办公类-16-07-05】合并版“2023下学期 大班户外游戏&#xff08;有场地和无场地版&#xff0c;两周一次&#xff09;”&#xff08;python 排班表系…

css预处理器scss的使用如何全局引入

目录 scss 基本功能 1、嵌套 2、变量 $ 3、mixin 和 include 4、extend 5、import scss 在项目中的使用 1、存放 scss 文件 2、引入 variables 和 mixins 2-1、局部引入 2-2、全局引入 3、入口文件中引入其他文件 项目中使用 css 预处理器&#xff0c;可以提高 cs…

Uibot6.0 (RPA财务机器人师资培训第1天 )RPA+AI、RPA基础语法

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北之前的几篇博客&#xff0c;友友们我们即将开展新课的学习~…

Vulnhub - Raven2

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Raven2 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/raven-2,269/ 0x01 信息收集 Nmap扫描…

spring-boot-devtools debug SilentExitException

spring-boot-devtools debug SilentExitException&#xff1a;springboot热部署debug模式进入SilentExitException /** Copyright 2012-2019 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use …

软考网工学习笔记(6) 广域通信网

公共交换电话网&#xff08;pstn&#xff09; 在pstn是为了语音通信而建立的网络。从20世纪60你年代开始用于数据传输 电话网有三个部分组成&#xff1a; 本地回路 &#xff0c;干线 和 交换机 。 干线 和 交换机 一般采用数字传输和交换技术 &#xff0c;而 本地回路基本采…

Ubutun部署docker,并使用docker部署springboot项目,关闭软件可继续访问

工具为xftp和xshell。 我这里使用的Ubuntu的版本是20.04的&#xff0c;话不多说&#xff0c;我们来直接上代码。 首先我们最好使用管理员权限进行操作&#xff0c;预防操作时遇到权限问题。 部署docker 登入管理员 不登入管理员也没关系。 su根据提示输入密码&#xff0c;进…

2024蓝桥杯每日一题(并查集)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶酪 试题二&#xff1a;合并集合 试题三&#xff1a;连通块中点的数量 试题四&#xff1a;网络分析 试题一&#xff1a;奶酪 【题目描述】 现有一块大奶酪&#xff0c;它的高度为 hℎ…

shell source脚本中如何读取另外一个脚本中的变量

目录 前言语法举例注意 前言 要在一个Shell脚本中读取另一个Shell脚本中的变量&#xff0c;可以使用source命令或者.命令。这些命令用于在当前Shell环境中运行指定的脚本&#xff0c;从而使得脚本中的变量在当前Shell中可用。 语法 #!/bin/bash # 读取另一个Shell脚本中的变…

金智维的务实主义,打响大模型落地“突围战”

今年以来&#xff0c;新质生产力成为全社会关注的焦点。新质生产力的特征之一&#xff0c;就是深化新技术应用&#xff0c;尤其是AI及大模型&#xff0c;要加速落地到实际业务场景中&#xff0c;为千行万业提质增效。 2024是大模型技术做深、价值做实的一年。3月20日&#xff0…

【C++】详解智能指针

目录 一、智能指针的作用二、内存泄露1、什么是内存泄露2、内存泄漏分类3、如何避免内存泄露 三、智能指针的使用及原理1、RAII2、智能指针的原理3、std::auto_ptr4、std::unique_ptr5、std::shared_ptr1、std::shared_ptr原理2、std::shared_ptr的线程安全问题4、std::shared_…