Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array
[1,2,3,4,5,6,7]
is rotated to [5,6,7,1,2,3,4]
.
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Hint:
Could you do it in-place with O(1) extra space?
Could you do it in-place with O(1) extra space?
Related problem: Reverse Words in a String II
Solution:
假设nums[] = 1 2 3 4 5, k = 3, 如图:
从index=0(第一个数)开始移动,第一个数移动到(postion + k) % len位上, 将(postion + k) % len位上的数先存到temp里, 按此规律往下移动。
Run time complexity is O(n), constant space.
public class Solution { public void rotate(int[] nums, int k) { if(nums == null || nums.length == 0) return; int len = nums.length; int count = 0; int j = 0; while(count < len) { int postion = j; int val = nums[postion]; do { postion = (postion + k) % len; int temp = nums[postion]; nums[postion] = val; val = temp; count++; }while(postion != j); //position = j 意味着开始重复这个跳跃的循环 j++; //跳出当前循环,重新开始下一个循环 } } }
No comments:
Post a Comment