力扣:轮转数组

题目

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

相关推荐
Ivanqhz9 分钟前
刚体的自由度
人工智能·算法
KaMeidebaby27 分钟前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法
Yang_jie_031 小时前
笔记:数据结构(栈是否使用底指针以及头指针的初始化值)
数据结构·笔记·算法
2301_800895101 小时前
信息安全数学基础复习
算法
爱折腾的小黑牛2 小时前
简记往来批量录入功能的实现:从文本到结构化数据
前端·算法
Starmoon_dhw2 小时前
题解:P17078 夏日甜点
c++·学习·算法·图论
海石3 小时前
【JS击败90%】前缀和+定长滑动窗口
算法·leetcode
Tisfy3 小时前
LeetCode 2685.统计完全连通分量的数量:DFS求每个连通块的边点数
算法·leetcode·深度优先··题解·连通图·全连通分量
海石3 小时前
1次遍历,空间复杂度击败100%,时间复杂度击败85%
算法·leetcode
L歪歪君4 小时前
Apache Doris全链路性能优化实战指南:从架构设计到生产落地
java·开发语言·算法