力扣:轮转数组

题目

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

相关推荐
jingfeng51422 分钟前
哈希表的概念+实现
数据结构·哈希算法·散列表
剪一朵云爱着22 分钟前
PAT 1091 Acute Stroke
算法·pat考试
子夜江寒25 分钟前
基于 Python 库使用贝叶斯算法与逻辑森林
开发语言·python·算法
君义_noip1 小时前
信息学奥赛一本通 1615:【例 1】序列的第 k 个数
c++·算法·信息学奥赛·csp-s
ホロHoro1 小时前
数据结构非线性部分(1)
java·数据结构·算法
Blossom.1181 小时前
大模型推理优化实战:连续批处理与PagedAttention性能提升300%
大数据·人工智能·python·神经网络·算法·机器学习·php
沉下去,苦磨练!1 小时前
实现二维数组反转
java·数据结构·算法
bybitq1 小时前
Leetcode-3780-Python
python·算法·leetcode
如何原谅奋力过但无声1 小时前
【力扣-Python-75】颜色分类(middle)
python·算法·leetcode
玖剹1 小时前
哈希表相关题目
数据结构·c++·算法·leetcode·哈希算法·散列表