轮转数组
- 给定一个整数数组
nums
,将数组中的元素向右轮转k
个位置,其中k
是非负数。
输入: 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]
- 解法1:把数组看成一个队列,每一轮相当于取出队尾元素后,其他元素向后移动一位,然后队尾元素插入队头完成,循环k次即可达到效果。当输入数组元素过多时,会有超时的风险。
class Solution {
public void rotate(int[] nums, int k) {
for (int i=0;i<k;i++) {
forward(nums);
}
}
private void forward(int[] nums) {
int n = nums.length;
int a = nums[n-1];
for (int i=n-1;i>0;i--) {
nums[i] = nums[i-1];
}
nums[0] = a;
}
}
- 解法2:数组进行分段,长度为n的数组分割成长度为n-k的数组arr1和k的数组arr2,然后拼接数组arr2和arr1得到结果,当k大于n时,只需要转动k%n次即可,当k%n为0时不需要转动。
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
if (k > n) {
k %= n;
}
if (k < n) {
int[] arr1 = new int[k];
int[] arr2 = new int[n-k];
System.arraycopy(nums, n-k, arr1, 0, k);
System.arraycopy(nums, 0, arr2, 0, n-k);
for (int i=0;i<k;i++) {
nums[i] = arr1[i];
}
for (int i=0;i<n-k;i++) {
nums[k+i] = arr2[i];
}
}
}
}
标签:轮转,arr1,nums,int,arr2,数组,Java
From: https://blog.csdn.net/dolly_baby/article/details/140864591