力扣189,旋转数组

题目:将数组向右移动k位;
逐个右移,
如:123456,
右移2位,
先,1->3;3->5,5->1;即521436;
然后:2->4,4->6,6->2;即561234;
0ms;40MB;

class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;//k可能大于nums.length,取余是真正移动的距离
        int count = 0;//计数,你每个数都会移动一次,所以一共移动nums.length次
        for(int s = 0 ; count < nums.length; s++){
            int i = s;
            int pre = nums[s];//保存起始位置的值
            do{
                int next = (i+k)%nums.length;//目标位置
                int temp = nums[next];//保存目标位置的值
                nums[next] = pre;//把值移动到目标位置
                pre = temp;//改变下一个要移动的值
                i=next;//改变下标
                count++;
            }while(i!=s);
        }  
    }
}

暴力:
每次向右移动1位,移动k次,累死
297ms;40MB;

class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;
        int pre,tem;
        for(int i =0;i<k;i++){
            pre = nums[nums.length-1];
            for(int j = 0; j< nums.length;j++){
                tem = nums[j];
                nums[j] = pre;
                pre = tem;
            }
        }
    }
}

开辟额外的数组空间:
没啥意思,不用动脑子
1ms;40MB

public class Solution {
    public void rotate(int[] nums, int k) {
        int[] temp = new int[nums.length];
        //把原来数组的数移动k位后保存到新数组;
        for (int i = 0; i < nums.length; i++) {
            temp[(i + k) % nums.length] = nums[i];
        }
        //把新数组的数组拷回原数组
        for (int i = 0; i < nums.length; i++) {
            nums[i] = temp[i];
        }
    }
}

反转数组;
没啥意思,虽然时间复杂度是O(N),但每个元素都被访问了俩次;

public class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }
    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值