力扣:轮转数组

题目

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

相关推荐
蒟蒻小袁19 分钟前
力扣面试150题-- 翻转二叉树
算法·leetcode·面试
养一只Trapped_beast22 分钟前
【LeetCode】删除排序数组中的重复项 II
算法·leetcode·职场和发展
矢鱼25 分钟前
单调栈所有模版(2)
算法
轮到我狗叫了32 分钟前
力扣智慧思想小题,目录力扣.跳跃游戏(思想很重要)力扣.跳跃游戏II(还是思想)力扣.分发糖果力扣151.反转字符串中的单词力扣.轮转数组
数据结构·算法·leetcode
zxctsclrjjjcph41 分钟前
【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
开发语言·c++·算法·力扣
朱剑君1 小时前
排序算法——堆排序
算法·排序算法
10000hours1 小时前
【SGL】Scatter-Gather List内存传输技术
linux·数据结构·网络协议·list·存储·sgl
某不知名網友1 小时前
linux_进程地址空间(虚拟地址空间)
java·linux·算法
bryant_meng2 小时前
【python】Calculate the Angle of a Triangle
开发语言·python·算法
纪元A梦2 小时前
贪心算法应用:最小反馈顶点集问题详解
java·算法·贪心算法