竟然可以这样旋转数组?
标签: 小浩算法 数组 算法 leetcode 数据结构 java go
01、题目分析
| 题目189: 旋转数组 |
|---|
| 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 |
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
- 向右旋转 1 步: [7,1,2,3,4,5,6]
- 向右旋转 2 步: [6,7,1,2,3,4,5]
- 向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
- 向右旋转 1 步: [99,-1,-100,3]
- 向右旋转 2 步: [3,99,-1,-100]
说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。
这道题如果不要求原地翻转的话,其实相当简单。但是原地翻转的方法却并不容易想到,我们直接看题解。
02、题目图解
这个方法基于这个事实:若我们需要将数组中的元素向右移动 k 个位置, 那么 k%l (l为数组长度) 的尾部元素会被移动到头部,剩下的元素会被向后移动。
假设 我们现在数组为[1,2,3,4,5,6,7], l=7 且 k=3 。
如下图可以看到5,6,7 被移动到 数组头部。

通过观察我们可以得到,我们要得到最终的结果。我们只需要将所有元素反转,然后反转前 k 个元素,再反转后面l-k个元素,就能得到想要的结果。
如下图:

03、题目解答
根据分析,我们先给出go语言题解:
//GO
func rotate(nums []int, k int) {
reverse(nums)
reverse(nums[:k%len(nums)])
reverse(nums[k%len(nums):])
}
func reverse(arr []int) {
for i := 0; i < len(arr)/2; i++ {
arr[i], arr[len(arr)-i-1] = arr[len(arr)-i-1], arr[i]
}
}
再给出java语言题解:
//JAVA
class Solution {
public void rotate(int[] nums, int k) {
reverse(nums, 0, nums.length-1);
reverse(nums, 0, k%nums.length-1);
reverse(nums, k%nums.length, nums.length-1);
}
public void reverse(int[] arr, int start, int end) {
while(start < end) {
arr[start] = arr[start] ^ arr[end];
arr[end] = arr[start] ^ arr[end];
arr[start] = arr[start] ^ arr[end];
start ++;
end --;
}
}
}
我把我写的所有题解都整理成了一本电子书,每道题都配有完整图解。点击即可下载
智能推荐
旋转数组
/*题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 PS:给出的所有元素都大于0,若数组大小为0,请返回0。*/ 方法一: 遍历数组用变量min记录最小值 方法二: 将数组排序,返回最小值 方法三: 二分...
【leetcode】旋转数组
旋转数组 题目: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 示例2: 输入: [-1,-100,3,...
Leetcode 旋转数组
题目描述 一个数组A中存有N个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 示例1 输入 复制 输出 复制 思路一: 对称思路: 将A[0,n-m]部分对换 将A[n-m,n]部分对换 最后将整个A对换 &n...
旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 示例 2: 说明: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。要求使用空间复杂度为 O(1) 的 原地 算法。 题目信息 输入:数组nums、整数k 输出:修改数组(nums向右移动k位) 额外条件:空间复杂度O(1) 思...
【转载】旋转数组
原文地址:https://www.namidame.tech/rotate-array.html 1. 问题描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,...
猜你喜欢
CSS3边框和圆角 学习打卡
课程介绍 1、CSS3圆角 2、CSS3盒阴影 3、CSS3边界图片 CSS3圆角 1、border-radius:一个最多可以指定四个border-*-radius属性的复合属性,为元素添加圆角边框 2、语法:border-radius:1-4 length|%/1-4 length|% 3、兼容:IE9+ firefox4+ chrome safari5+ opera CSS3指定每一个圆角 ...
(Java)反射的应用 - 取得类的结构
文章目录 一、基本概念 二、取得所实现的全部接口 三、取得父类 四、取得全部构造方法 五、取得全部方法 六、取得全部属性 一、基本概念 在反射机制中,还可以通过反射得到一个类的完整结构,这就需要使用 java.lang.reflect 包中的以下几个类: 这三个类都是 AccessibleObject 类的子类: 二、取得所实现的全部接口 要取得一个类所实现的全部接口,必须使用 Class 类中的...
ORM-外键关联基本使用
外键 在Mysql中,外键可以让表之间关系变得更加紧密, 在SQlAlchemy中, 通过ForeignKey类来实现,并且可以指定表的外键约束 FroeignKey的导入 在从表中条件一个模型类.字段(属性)即可 外键关联的代码和示例图 图说明 外键约束的删除 如果删除了主表中的数据, 从表的数据会怎么样? 需要设置 "RESTRICT" : 主表数据被删除, 会阻止删除 &...
Linux操作心得(1)
Ubuntu 16.04 (1)今天遇到一个蜜汁尴尬的情况,一本书上的示例,要求我建一个文件夹及子文件夹,然而明明创建的文件却没有显示 按书上此时应该出现一个文件夹,但并没有: 但可以进入,作为小白看不懂,后来发现是因为/XX指的是将文件建立在根目录了,因此不管怎样,就算用ls,或ll命令都查不到的,此时正确方法应该是去掉/backup前的/,如图就解决了文件夹的创建过程,还有一种傻瓜式方法就是直...
