189. Rotate Array 反转数组 #Array

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

189. Rotate Array

https://leetcode.com/problems/rotate-array/

Description

Given an array, rotate the array to the right by k steps, where k is non-negative.

Example 1:

Input: [1,2,3,4,5,6,7] and k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]
Example 2:

Input: [-1,-100,3,99] and k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
Note:

Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Could you do it in-place with O(1) extra space?

Solutions

  1. 首先想到的是键值对字典,改键,然后变成数组,然而怎么变来变去呢。
  2. 观察到旋转后的数组分为两部分,前面的平移到后面,后面的平移到前面。写吧~
    啊如果数组可以切片和拼接就好了。找到了Arrays.copyOfRange方法可以切片,然后用遍历拼接。

Submissions

我的~

class Solution {
    public void rotate(int[] nums, int k) {  
        k=k%nums.length;
        //用 Arrays.copyOfRange 方法对数组在 nums.length-k 的位置切片
        int []sub1=Arrays.copyOfRange(nums,nums.length-k,nums.length);
        int []sub2=Arrays.copyOfRange(nums,0,nums.length-k);
        
        //将sub1和sub2合并成一个数组,写入[]nums
        for(int i=0;i<sub1.length;i++)
            nums[i]=sub1[i];
        for(int i=sub1.length;i<res.length;i++)
            nums[i]=sub2[i-sub1.length]; 
    }
}

答案的~
reverse前半部分、后半部分、全部
时间复杂度:O(n) 。 n 个元素被反转了总共 3 次。
空间复杂度:O(1) 。 没有使用额外的空间。

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--;
        }
    }
}

Summary

https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
我的方法和题解的方法都不一样,差不多和最后一种类似吧。但我用了额外的空间sub1和sub2。

copyOfRange的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值