力扣:轮转数组

题目

给定一个整数数组 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]

题解

java 复制代码
public static void ratote(int[] nums,int k){
  /*****************方法一:借助临时数据*******************/
//        int[] tempNums = new int[nums.length];
//        for (int i = 0; i < nums.length; i++) {
//            tempNums[(i + k) % nums.length] = nums[i];
//        }
//        for (int i = 0; i < nums.length; i++) {
//            nums[i] = tempNums[i];
//        }
   /*****************方法二:翻转数组*******************/
   k %= nums.length;
   reverse(nums, 0, nums.length - k - 1);
   reverse(nums, nums.length - k, nums.length - 1);
   reverse(nums, 0, nums.length - 1);
}

private static void reverse(int[] nums, int start, int end) {
   while (start < end) {
       int temp = nums[start];
       nums[start] = nums[end];
       nums[end] = temp;
       start++;
       end--;
   }
}

最容易想到的一种方式就是借助一个临时数据,先把后k位数组先放到临时数组中,再将前nums.length-k位顺序放到临时数组中。这里往临时数组中放数时有个取巧方式,借助数组长度来取余。要轮转k个数字,临时数组中前k位肯定是要放原数组中的后k个数字的,因此原数组的第1个元素要放置在临时数组的第k+1位置上,对应数组下标为(k % nums.length)

该种方式的时间复杂度:O(n) 空间复杂度:O(n)

第二种方式为翻转数组,先翻转前n-k个,再翻转后k个,然后再将整个数组翻转。

时间复杂度:O(n) 空间复杂度:O(1)

相关推荐
随缘而动,随遇而安1 分钟前
第八十八篇 大数据中的递归算法:从俄罗斯套娃到分布式计算的奇妙之旅
大数据·数据结构·算法
IT古董33 分钟前
【第二章:机器学习与神经网络概述】03.类算法理论与实践-(3)决策树分类器
神经网络·算法·机器学习
Alfred king3 小时前
面试150 生命游戏
leetcode·游戏·面试·数组
水木兰亭3 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
Jess074 小时前
插入排序的简单介绍
数据结构·算法·排序算法
老一岁4 小时前
选择排序算法详解
数据结构·算法·排序算法
xindafu4 小时前
代码随想录算法训练营第四十二天|动态规划part9
算法·动态规划
xindafu5 小时前
代码随想录算法训练营第四十五天|动态规划part12
算法·动态规划
freexyn5 小时前
Matlab自学笔记六十一:快速上手解方程
数据结构·笔记·matlab
ysa0510305 小时前
Dijkstra 算法#图论
数据结构·算法·图论