力扣:轮转数组

题目

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

相关推荐
C137的本贾尼5 分钟前
(每日一道算法题)二叉树剪枝
算法·机器学习·剪枝
吴声子夜歌33 分钟前
OpenCV——Mat类及常用数据结构
数据结构·opencv·webpack
笑口常开xpr1 小时前
数 据 结 构 进 阶:哨 兵 位 的 头 结 点 如 何 简 化 链 表 操 作
数据结构·链表·哨兵位的头节点
BUG收容所所长2 小时前
栈的奇妙世界:从冰棒到算法的华丽转身
前端·javascript·算法
XRZaaa2 小时前
常见排序算法详解与C语言实现
c语言·算法·排序算法
@我漫长的孤独流浪2 小时前
数据结构测试模拟题(4)
数据结构·c++·算法
智驱力人工智能2 小时前
智慧零售管理中的客流统计与属性分析
人工智能·算法·边缘计算·零售·智慧零售·聚众识别·人员计数
WindSearcher3 小时前
大模型微调相关知识
后端·算法
取酒鱼食--【余九】3 小时前
rl_sar实现sim2real的整体思路
人工智能·笔记·算法·rl_sar
Magnum Lehar5 小时前
vulkan游戏引擎test_manager实现
java·算法·游戏引擎