1.题目
2.题解
2.1暴力法
2.2辅助数组
2.3环形替换
2.4数组反转
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例:
输入: [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,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一次移动一位:
循环k次以上操作。
public class Solution189 {
public void rotate(int[] nums, int k) {
int len = nums.length, pre;
for (int i = 0;i
用辅助数组将每个元素放到正确的位置上,即原数组里下标为i的元素放到 (i+k)%数组长度的位置;
然后把新的数组拷贝到原数组中。
public class Solution189 {
public void rotate(int[] nums, int k) {
int len = nums.length;
int[] t = new int[len];
for (int i = 0; i < len; i++) {
t[(i + k) % len] = nums[i];
}
System.arraycopy(t, 0, nums, 0, len);
}
}
i%k相等的所有i对应的位置形成一个环形,则相当于把环形内的元素循环右移一位
public class Solution189 {
public void rotate(int[] nums, int k) {
int len = nums.length ,count = 0;
k %=len;
for (int start = 0; count < len ; start++) {
int current = (start+k)%len;
int pre = nums[start];
while (start != current){
int tmp = nums[current];
nums[current] = pre;
pre = tmp;
current = (current + k) %len;
count++;
}
nums[start] = pre;
count++;
}
}
}
旋转数组 k 次, k%n 个尾部元素会被移动到头部,剩下的元素会被向后移动。
比如:
nums: [1, 2, 3, 4, 5, 6,7]
k: 3
原数组 1 2 3 4 5 6 7
反转所有数字后 7 6 5 4 3 2 1
反转前k个数字后 5 6 7 4 3 2 1
反转后n-k个数字后 5 6 7 1 2 3 4
public class Solution189 {
public void rotate(int[] nums, int k) {
int len = nums.length;
k %= len;
reverse(nums, 0, len - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, len - 1);
}
public void reverse(int[] nums, int start, int end) {
while (start < end) {
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}
}