旋转数组
- 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例1
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例2
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的 原地 算法。
php code
while 状态:通过 执行用时:40 ms 内存消耗:16.8 MB
function rotate(&$nums, $k) {
$max = count($nums);
$k %= $max;
$count = 0;
if($k==0) return ;
$index = 0;
$t1 = 0;
$t2 = 0;
for($i=0;$i<$k;$i++){
if($count >= $max) break;
$index = $i;
$t1 = $nums[$i];
while(($index+$k)%$max != $i){
echo "index:".$index."|".($index+$k)%$max."|".$i."\n";
$t2=$nums[($index+$k)%$max];
$nums[($index+$k)%$max] = $t1;
$index = ($index+$k)%$max;
$t1 = $t2;
$count++;
}
echo $i."|".$count."\n";
$nums[$i] = $t1;
$count++;
}
return null;
}
java code
三次反转
while 状态:执行用时:1 ms 内存消耗:41.6 MB
public class Rotate {
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7};//示例1
//int[] nums = {-1,-100,3,99};//示例2
int k = 2;
rotate(nums,k);
}
//反转
public static int[] reverse(int[] nums, int start,int end){
for(int i=start,j=end;i<j;i++,j--){
//位异或运算,按位对比,相同取0,不同取1,实际上就是交换值
nums[j]^=nums[i];
nums[i]^=nums[j];
nums[j]^=nums[i];
}
return nums;
}
//三次反转
public static void rotate(int[] nums, int k){
nums = reverse(nums,0,nums.length-1);
System.out.println(Arrays.toString(nums));
nums = reverse(nums,0,k%nums.length);
System.out.println(Arrays.toString(nums));
nums = reverse(nums,k%nums.length+1,nums.length-1);
System.out.println(Arrays.toString(nums));
}
}

本文探讨了如何将数组中的元素向右移动k个位置,提供了三种不同的原地算法实现,包括一种基于循环的PHP实现和一种利用三次反转的Java实现,强调了O(1)的空间复杂度要求。

429

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



