Leetcode 旋转数组

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

旋转数组

  • 给定一个数组,将数组中的元素向右移动 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));
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值