【力扣-轮转数组 Java / Python】
题目:
思路:
有两种做法
1、✅ 方法一:额外数组
在复制一份数组,然后在把结果放回去。
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k = k % n; // 防止 k > nint[] temp = new int[n];for (int i = 0; i < n; i++) {temp[(i + k) % n] = nums[i];}// 再把结果拷贝回原数组for (int i = 0; i < n; i++) {nums[i] = temp[i];}}
}
2、✅ 方法二:数组反转(最优解,空间 O(1))
Java版本
1)先翻转整体数组
2)在反转前K个
3)在反转后N - K 个
举例:
原数组 [1,2,3,4,5,6,7], k=3
整体反转 → [7,6,5,4,3,2,1]
反转前 3 个 → [5,6,7,4,3,2,1]
反转后 4 个 → [5,6,7,1,2,3,4] ✅
class Solution {public void rotate(int[] nums, int k) {// 翻转数组,先全部,在前k 在剩下的int n = nums.length;k = k % n;reverse(nums, 0 , n - 1);reverse(nums, 0 , k - 1);reverse(nums, k , n - 1); }public void reverse(int[] nums, int left, int right) {while(left < right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}}
}
python版本
class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not return anything, modify nums in-place instead."""n = len(nums)k = k % nself.reverse(nums, 0, n - 1)self.reverse(nums, 0, k - 1)self.reverse(nums, k, n - 1)def reverse(self, nums, left, right):while left < right:temp = nums[left]nums[left] = nums[right]nums[right] = templeft += 1right -= 1