LeetCode- 189. 旋转数组-Java实现

博客介绍了数组移动的思路和结果。思路是将数组分为两部分,先分别反转前后部分,再整体反转数组,避免了将数组看成循环数组进行循环移动的复杂优化,去除了‘循环’的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

结果

在这里插入图片描述
代码:

class Solution {
    public void rotate(int[] nums, int k) {
        if(nums==null||nums.length<=1||k<=0){
            return;
        }

        int n = nums.length;
        k %= n;
        reverse(nums,0,n-k-1);
        reverse(nums,n-k,nums.length-1);
        reverse(nums,0,nums.length-1);

    }

    public void reverse(int[] nums,int start, int end){
        int temp;
        int len = (end-start+1)/2;
        for(int i = 0;i < len;i++){
            temp = nums[end-i];
            nums[end-i] = nums[start+i];
            nums[start+i] = temp;
        }
    }
}

思路

待移动数组:[1,2,3,4,5,6,7] , n = 7, k = 3
移动后数组:[5,6,7,1,2,3,4]

其实就是分了三步走,首先从整体上将数组分为两个部分,第一部分是移动到数组末尾的部分,即为1,2,3,4,另一部分为需要移动到数组前面的,即为5,6,7。这里提一个现象,也是后文的思路,1,2,3,4其实就是需要移动到后面的位置,如果1,2,3,4反转一下为4,3,2,1,这时候看一下整体数组的情况[4,3,2,1,5,6,7],如果通过整体数组的反转,数组正好为[7,6,5,1,2,3,4],并且1,2,3,4反转后留出了前面5,6,7需要的位置,我们只需要把5,6,7按照同样的方法先反转一下就好了,当然5,6,7可以先反转,也可以在数组整体反转后再反转。

  1. 将数组前部1,2,3,4反转为4,3,2,1
  2. 将数组后部5,6,7反转为7,6,5
  3. 将数组整体反转
    这个思路好处就是切割了,如果采用最傻的方法无非就是把数组看成一个循环数组,然后进行循环移动,这样如果做优化的话比较复杂,考虑情况比较多,那么此方法将数组进行分割,相当于去除了“循环”的复杂性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值