
思路:1.每次只向右移动一步,这样为一个周期。一共k个周期。
2.向右移k步,其实就是最后k个元素拿出来,插入到整个数组的最前面。这个规律也不难发现。我们利用reverse来实现。
下面分别展示两种思路的代码:
第一种思路代码:
class Solution {
public void rotate(int[] nums, int k) {
while(k > 0){
oneRotate(nums);
k--;
}
}
private void oneRotate(int[] nums){
int len = nums.length;
int pre = nums[len-1];
int temp;
for(int i = 0; i < len; i++){
temp = nums[i];
nums[i] = pre;
pre = temp;
}
}
}
第二种思路详细解释:
Original List : 1 2 3 4 5 6 7
After reversing all numbers : 7 6 5 4 3 2 1
After reversing first k numbers : 5 6 7 4 3 2 1
After revering last n-k numbers : 5 6 7 1 2 3 4 --> Result
第二种思路代码:
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--;
}
}
}
总结:
- 两种方法space complexity 都是O(1),这表明都是in-place的。
423

被折叠的 条评论
为什么被折叠?



