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]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

分析

此算法是要求数组原地进行轮转,经过分析,可以得出,每个元素在轮转之后的下标都为

复制代码
(当前下标+k)%数组长度

所以可以将数组遍历n(数组长度)次,每一次都将当前元素轮转后下标对应的元素先存起来,然后将对应的元素进行交换,循环n次即可。

代码如下:

java 复制代码
    public static void rotate(int[] nums, int k) {
        int num=nums[0],a=0;
        for(int i=0;i<nums.length;i++){
            int b=(a+k)%nums.length;
            int tmp=nums[b];
            nums[b]=num;
            num=tmp;
            a=b;
        }
    }

但是此代码放上去之后,又出现了一个问题:

也就是会出现轮转到已经轮转过的元素上去。

然后我看了一下官方的题解:

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] newArr = new int[n];
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        System.arraycopy(newArr, 0, nums, 0, n);
    }
}

官方的解决方法是new一个新的数组,并不是原数组进行轮转。

java 复制代码
System.arraycopy:

src:源数组

srcPos:源数组要复制的起始位置

dest:目标数组

destPos:目标数组放置的起始位置

length:复制的长度
相关推荐
Miraitowa_cheems3 小时前
LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
java·算法·leetcode·链表·职场和发展
wan5555cn3 小时前
AI生成内容的版权问题解析与实操指南
人工智能·笔记·深度学习·算法·音视频
今后1233 小时前
【数据结构】带哨兵位双向循环链表
数据结构·链表
Lee嘉图3 小时前
数据结构——队列(Java)
数据结构
DDAshley1264 小时前
【PaddleOCR】从零开始训练自己的模型--详细教程
算法·计算机视觉
梁辰兴4 小时前
数据结构:查找
数据结构·算法·查找·顺序查找·折半查找·分块查找
Brookty5 小时前
【算法】双指针(一)移动零
学习·算法
THMAIL5 小时前
机器学习从入门到精通 - 循环神经网络(RNN)与LSTM:时序数据预测圣经
人工智能·python·rnn·算法·机器学习·逻辑回归·lstm
程序员Xu5 小时前
【LeetCode热题100道笔记】二叉树的直径
笔记·算法·leetcode