LeetCode算法学习之旋转数组
完整代码实现
class Solution {public void rotate(int[] nums, int k) {// 第一种解题思路//数组中每个元素的索引值向右增加k个 如果增加后的数字没有超过数组长度 那么就正常存放到新数组对应索引的位置//如果 超出了索引 就用新索引减去原数组的长度的新索引进行赋值//注意点:k的取值,因为k的长度会超过数组的长度,直接使用k有可能造成索引越界的问题,所以新的k值需要对最初的k进行对数组长度取模的操作int[] result = new int[nums.length];k = k % nums.length;if(nums.length == 1){return;}for(int i = 0;i<nums.length;i++){if(i+k<nums.length){result[i+k] = nums[i];}else if(i+k>=nums.length){result[i+k-nums.length] = nums[i];}} for(int i = 0;i<nums.length;i++){nums[i] = result[i];}}
}解题思路:
关键观察
1. 旋转的周期性:旋转数组的长度 n 次后,数组会恢复到原始状态。因此,旋转 k 次等价于旋转 k % n 次。例如,k = 10 且 n = 7 时,旋转 10 次等价于旋转 3 次(因为 10 % 7 = 3)。
2. 索引映射:对于数组中的每个元素,旋转后的新位置可以通过 (i + k) % n 计算得到,其中 i 是原始索引,n 是数组长度
算法步骤
1. 处理 k 的值:
计算 k = k % nums.length,确保 k 在 [0, n-1] 范围内,避免不必要的旋转和索引越界
2. 特殊情况处理:
如果数组长度为 1,直接返回,因为旋转不会改变数组
3. 创建临时数组:
创建一个与原数组相同长度的临时数组 result,用于存储旋转后的结果
4. 计算新索引并填充临时数组:
遍历原数组,对于每个元素 nums[i]:
如果 i + k 在数组范围内(即 i + k < n),则 result[i + k] = nums[i]
如果 i + k 超出数组范围(即 i + k >= n),则 result[i + k - n] = nums[i]
实际上,这两种情况可以统一用 result[(i + k) % n] = nums[i] 表示
5. 复制回原数组:
将临时数组 result 的内容复制回原数组 nums
