leetcode 189. Rotate Array-旋转数组

原题链接:189. Rotate Array

【思路1-Java、Python】时间复杂度O(n),空间复杂度O(1)

以[1,2,3,4,5,6,7], k=3 为例,经过3次翻转,就能得到结果:

        reverse(nums, 0, nums.length - 1);  //[7,6,5,4,3,2,1]
        reverse(nums, 0, k - 1);            //[5,6,7,4,3,2,1]
        reverse(nums, k, nums.length - 1);  //[5,6,7,1,2,3,4]

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);
    }
    private void reverse(int[] nums, int m, int n) {
        while (m < n) {
            int temp = nums[m];
            nums[m++] = nums[n];
            nums[n--] = temp;
        }
    }
}

33 / 33 test cases passed. Runtime: 1 ms  Your runtime beats 11.70% of javasubmissions.

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        k %= len(nums)
        self.reverse(nums, 0, len(nums) - 1)
        self.reverse(nums, 0, k - 1)
        self.reverse(nums, k, len(nums) - 1)
    def reverse(self, nums, start, end) :
        while start < end :
            nums[start], nums[end] = nums[end], nums[start]
            start += 1
            end -= 1
33 / 33  test cases passed. Runtime: 84 ms  Your runtime beats 49.51% of pythonsubmissions.

【思路2-Java、Python】时间复杂度O(n),空间复杂度O(1)

以 k 为长度,循环移动 n 次,

以[1, 2, 3, 4, 5, 6, 7], k = 3为例,过程是这样的:

[1, 2, 3, 1, 5, 6, 7]

[1, 2, 3, 1, 5, 6, 4]

[1, 2, 7, 1, 5, 6, 4]

[1, 2, 7, 1, 5, 3, 4]

[1, 6, 7, 1, 5, 3, 4]

[1, 6, 7, 1, 2, 3, 4]

[5, 6, 7, 1, 2, 3, 4]

[5, 6, 7, 1, 2, 3, 4]

然而有时候有可能循环移动会出现死循环情况,所以要加上①处判断条件,以[1, 2, 3, 4, 5, 6], k = 2为例

[1, 2, 1, 4, 5, 6]

[1, 2, 1, 4, 3, 6]


[5, 2, 1, 4, 3, 6]

[5, 2, 1, 4, 3, 6]  //这时 distance = 0了,所以要调整


[5, 2, 1, 2, 3, 6]


[5, 2, 1, 2, 3, 4]

[5, 6, 1, 2, 3, 4] //同样 distance = 0

[5, 6, 1, 2, 3, 4]

public class Solution {
    public void rotate(int[] nums, int k) {
        for (int i=0, idx=0, cur=nums[0], distance=0, n=nums.length; i < n; i++) {
            idx = (idx + k) % n;
            
            int temp = cur;  //交换 cur 和 nums[idx]
            cur = nums[idx];
            nums[idx] = temp;
            
            distance = (distance + k) % n;  //①
            if (distance == 0) {
                idx = (idx + 1) % n;
                cur = nums[idx];
            }
        }
    }
}
33 / 33  test cases passed. Runtime: 2 ms  Your runtime beats 2.72% of javasubmissions.
class Solution:
    # @param nums, a list of integer
    # @param k, num of steps
    # @return nothing, please modify the nums list in-place.
    def rotate(self, nums, k):
        n = len(nums)
        idx = 0
        distance = 0
        cur = nums[0]
        for x in range(n):
            idx = (idx + k) % n
            nums[idx], cur = cur, nums[idx]
            
            distance = (distance + k) % n
            if distance == 0:
                idx = (idx + 1) % n
                cur = nums[idx]
33 / 33  test cases passed. Runtime: 88 ms  Your runtime beats 40.12% of pythonsubmissions.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值