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:复制的长度
相关推荐
落了一地秋3 分钟前
4.5 优化器中常见的梯度下降算法
人工智能·算法·机器学习
前端伪大叔9 分钟前
第 5 篇:策略参数怎么调优?Freqtrade hyperopt 快速入门
算法·代码规范
Code季风10 分钟前
深入理解令牌桶算法:实现分布式系统高效限流的秘籍
java·算法·微服务
KyollBM30 分钟前
【Luogu】每日一题——Day15. P1144 最短路计数 (记忆化搜索 + 图论 + 最短路)
算法·图论
一百天成为python专家38 分钟前
K-近邻算法
数据结构·python·算法·pandas·近邻算法·ipython·python3.11
满分观察网友z1 小时前
告别烦人的“三连发”:我的智能评论系统过滤之旅(1957. 删除字符使字符串变好)
算法
小新学习屋1 小时前
《剑指offer》-数据结构篇-哈希表/数组/矩阵/字符串
数据结构·leetcode·哈希表
满分观察网友z1 小时前
滑动窗口下的极限挑战:我在实时数据流中挖掘最大价值分(1695. 删除子数组的最大得分)
算法
山烛1 小时前
KNN 算法中的各种距离:从原理到应用
人工智能·python·算法·机器学习·knn·k近邻算法·距离公式
guozhetao1 小时前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论