Leetcode 面试150题 189. 轮转数组 中等
系列博客目录
文章目录
- 系列博客目录
- 189. 轮转数组 中等
- 示例 1
- 示例 2
- 解答
189. 轮转数组 中等
链接
描述:
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负整数。
示例 1
输入: nums = [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
输入: nums = [-1, -100, 3, 99], k = 2
输出: [3, 99, -1, -100]
解释:
向右轮转 1 步: [99, -1, -100, 3]
向右轮转 2 步: [3, 99, -1, -100]
提示:
1 <= nums.length <= 10^5
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^5
进阶:
尽可能想出更多的解决方案,至少有 三种不同的方法 可以解决这个问题。
你可以使用 空间复杂度为 O(1) 的 原地算法 来解决这个问题吗?
解答
一开始认为只要新建一个数组,然后根据k把原数组的值先在新数组中填到对应的位置即可,然后把新数组的值赋值到原数组即可。
class Solution {
public void rotate(int[] nums, int k) {
int[] result = new int[nums.length];
for (int i = k; i < result.length; i++) {
result[i] = nums[i-k];
}
for (int i = 0; i < k; i++) {
result[i] = nums[nums.length-k+i];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = result[i];
}
}
}
后来,发现k可能比数组长度大,那样的话上面i-k
肯定会超范围。以为添加如下代码在前面即可。但是其实不对,比如nums = [1, 2, 3, 4, 5, 6, 7]
, k 为8和9,他是不一样的。
if(nums.length<=k){
return;
}
然后就修改为了,根据k,分成k步,每次把最后面插入到最前面。但是OJ(online judge)会超时间限制“Time Limit Exceeded”(TLE)。后来发现,其实如果k大于数组的长度,k的前面数组长度部分对数组的操作其实是没必要的,相当于一步一步不断从最后插入第一个,操作了一轮,实则没有变化。
最后得到了自己的答案如下。
class Solution {
public void rotate(int[] nums, int k) {
int[] result = new int[nums.length];
int index=k%nums.length;
for (int i = index; i < result.length; i++) {
result[i] = nums[i-index];
}
for (int i = 0; i < index; i++) {
result[i] = nums[nums.length-index+i];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = result[i];
}
}
}