189 Rotate Array

Rotate Array

题目要求向右旋转给定数组k次

Python代码:

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 = k % len(nums)
        nums[:] = nums[-k:] + nums[:-k]

注意最后一定要nums[:] = nums[-k:] + nums[:-k]而不是nums = nums[-k:] + nums[:-k]因为在OJ中前者可以彻底改变旧数组,而后者只将他的引用改变到了一个新的数组中。

Solution中的几种解法:
1 Brute Force

暴力法,时间复杂度 O(nk) O ( n ∗ k )

2 Using Extra Array

将数组按照轮转后的顺序排序在新数组中,再将新数组赋值到原数组中。

3 Using Cyclic Replacements

这是一个时间复杂度为 O(n) O ( n ) 的算法。算法的思想是从数组的第一个元素开始,直接将数组第一元素的数值替换到他轮转后的位置,同时将轮转后位置的原数值记录到temp中。如将1, 2, 3, 4, 5, 6, 7这一序列轮转3次,即 k=3 k = 3 。则直接将数组第一个位置nums[0]1替换到nums[3]的位置,同时将该位置原元素记录到temp中。所以替换后temp = 4数组变为1, 2, 3, 1, 5, 6, 7。第二次循环从nums[3]位置开始,该位置原元素4替换到他轮转后的位置并记录将被4替换掉的元素的值到temp中。循环n次后,数组全部被替换完毕。

1, 2, 3, 4, 5, 6, 7轮转三次:

1, 2, 3, 1, 5, 6, 7  temp=4
1, 2, 3, 1, 5 ,6 ,4  temp=7
1, 2, 7, 1, 5, 6, 4  temp=3
1, 2, 7 ,1, 5, 3, 4  temp=6
1, 6, 7, 1, 5, 3, 4  temp=2
1, 6, 7, 1, 2, 3, 4  temp=5
5, 6, 7, 1, 2, 3, 4

n/k n / k 为整数时会要被替换的元素是我们第一次要替换元素的情况,如图:

所以我们通过两个循环解决问题。下面是leetcode中solution的Java代码:

public class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;
        int count = 0;
        for (int start = 0; count < nums.length; start++) {//外部的循环,上图中的红色、绿色循环
            int current = start;
            int prev = nums[start];
            do {
                int next = (current + k) % nums.length;
                int temp = nums[next];
                nums[next] = prev;
                prev = temp;
                current = next;
                count++;
            } while (start != current);//内部的小循环,1,3,5元素间的相互替换
        }
    }
}
4 Using Reverse

先将整个数组反转,而后反转前k项,再反转后n-k项

Original List                   : 1 2 3 4 5 6 7
After reversing all numbers     : 7 6 5 4 3 2 1
After reversing first k numbers : 5 6 7 4 3 2 1
After revering last n-k numbers : 5 6 7 1 2 3 4 --> Result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值