LeetCode - 189 旋转数组

题目

将包含 n 个元素的数组向右旋转 步。

例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4]

注意:

尽可能找到更多的解决方案,这里最少有三种不同的方法解决这个问题。


思路

1 题目比较好理解,但是自己在第一次写的时候却不是那么容易,关键是理清关系

2 对于way 1 首先是k, 简单通俗的将 k为3时, 数组的长度为7,只需要将后三个数移动到数组的前端。k 大于数组的长度时取余

3  way 1 既然是要把后面的数移动到前面 自然想到先将整体的数组翻转

                2 翻转 0 k-1的位置

                3 翻转 k-1 nums.length - 1的位置 

    翻转后的两部分的顺序是不变的

    翻转函数就比较简单了,记录start和end,  借助中间值调换首位的位置,通知更改start 和 end的值 

    while循环的条件就是start要小于end ,因为相同的时候整体已经翻转过来了

    way 2 如果利用辅助数组的话, nums.clone() 保存了一份拷贝,只需遍历整个数组更改索引位置的值即可,即现在这个位置的值应该存放在哪个位置。位置要取余。空间复杂度o(N)

    way 3 直白讲就是转圈的形式,从后往前推,这样推k次

              第一次保存下最后的位置,nums.length到0位置的数以前等于前一个数, 第一个数赋值之前保存的末尾值

               比较好理解

    时间复杂度都是 o(n)


代码

public class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length; 
        //(1) new array; 
        int[] oldNums = nums.clone();
        for(int i = 0; i< nums.length;i++){
            nums[(i+k)%nums.length] = oldNums[i]; 
        }
        
        //(2) reverse 3 times 
        // reverse(nums, 0, nums.length-1); 
        // reverse(nums, 0, k-1);
        // reverse(nums, k, nums.length-1); 
        
        //(3) move k times
        // while(k-->0){
        //     int tmp = nums[nums.length-1];
        //     for(int i = nums.length-1; i>0; i--){
        //         nums[i] = nums[i-1];
        //     }
        //     nums[0] = tmp; 
        // }
    }
    
    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--; 
        }
    }
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值