轮转数组(力扣189)

简介: 轮转数组

 题目描述:

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例1:

输入: nums = [1,2,3,4,5,6,7], k = 3

输出: [5,6,7,1,2,3,4]

解释:

向右轮转 1 步: [7,1,2,3,4,5,6]

向右轮转 2 步: [6,7,1,2,3,4,5]

向右轮转 3 步: [5,6,7,1,2,3,4]

示例2:

输入:nums = [-1,-100,3,99], k = 2

输出:[3,99,-1,-100]

解释:

向右轮转 1 步: [99,-1,-100,3]

向右轮转 2 步: [3,99,-1,-100]

方法一:重新插入法

通过观察,我们可以先创建一个新数组,将原数组的元素轮转k位后放入新数组对应的位置,将所有元组放完后,再将新数组的元素覆盖给原数组即可,但是如果k很大,我们就要轮转好多次,所以我们可以取模,轮转最少次数。

image.gif编辑

代码实现:

public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[(i+k)%n] = nums[i];
        }
        for (int i = 0; i < n; i++) {
            nums[i] = arr[i];
        }
    }

image.gif

方法二:反转数组法

此方法是解决这类问题常用的一种方法,比较节省空间,不用创建新数组,将数组反转三次,即可完成数组轮转。

image.gif编辑

代码实现:

publicvoidrotate1(int[] nums, intk) {
intn=k%nums.length;
reversal(nums,0,nums.length-1);
reversal(nums,0,n-1);
reversal(nums,n,nums.length-1);
    }
publicstaticvoidreversal(int[] arr,intl,intr){
while (l<r){
inttemp=arr[l];
arr[l] =arr[r];
arr[r] =temp;
l++;
r--;
        }
    }
相关文章
|
17天前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
12 0
|
17天前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
8 0
|
17天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
10 1
|
17天前
|
存储 算法
力扣每日一题 6/20 数学+数组
力扣每日一题 6/20 数学+数组
14 1
|
5天前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
13天前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
6 0
|
17天前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
15 0
|
17天前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
14 0
|
17天前
力扣随机一题 6/28 数组/矩阵
力扣随机一题 6/28 数组/矩阵
14 0
|
17天前
|
存储 安全
力扣每日一题 6/21 数组
力扣每日一题 6/21 数组
8 0