题目:将数组向右移动k位;
逐个右移,
如:123456,
右移2位,
先,1->3;3->5,5->1;即521436;
然后:2->4,4->6,6->2;即561234;
0ms;40MB;
class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;//k可能大于nums.length,取余是真正移动的距离
int count = 0;//计数,你每个数都会移动一次,所以一共移动nums.length次
for(int s = 0 ; count < nums.length; s++){
int i = s;
int pre = nums[s];//保存起始位置的值
do{
int next = (i+k)%nums.length;//目标位置
int temp = nums[next];//保存目标位置的值
nums[next] = pre;//把值移动到目标位置
pre = temp;//改变下一个要移动的值
i=next;//改变下标
count++;
}while(i!=s);
}
}
}
暴力:
每次向右移动1位,移动k次,累死
297ms;40MB;
class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
int pre,tem;
for(int i =0;i<k;i++){
pre = nums[nums.length-1];
for(int j = 0; j< nums.length;j++){
tem = nums[j];
nums[j] = pre;
pre = tem;
}
}
}
}
开辟额外的数组空间:
没啥意思,不用动脑子
1ms;40MB
public class Solution {
public void rotate(int[] nums, int k) {
int[] temp = new int[nums.length];
//把原来数组的数移动k位后保存到新数组;
for (int i = 0; i < nums.length; i++) {
temp[(i + k) % nums.length] = nums[i];
}
//把新数组的数组拷回原数组
for (int i = 0; i < nums.length; i++) {
nums[i] = temp[i];
}
}
}
反转数组;
没啥意思,虽然时间复杂度是O(N),但每个元素都被访问了俩次;
public class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。