本文共 738 字,大约阅读时间需要 2 分钟。
给定一个数组A和一个整数k,任务是将数组A右移k位。右移的意思是每个数字向右移动k步,如果移动到数组末尾后继续向右移动,就会从左边再次添加回去。
首先,需要将k模掉数组A的长度,这样可以简化后续操作。例如,如果k大于数组长度,就只需要移动k与数组长度的余数位置。
接下来,可以通过以下步骤实现右移:
这样的操作只需要三次反转,时间复杂度为O(n),非常高效。
具体实现如下:
public class Solution { public void rotate(int[] nums, int k) { int n = nums.length; k %= n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); } private void reverse(int[] nums, int i, int j) { while (i < j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; i++; j--; } }} 这种方法的时间复杂度为O(n),空间复杂度为O(1),非常适合处理大数组的问题。
转载地址:http://vocs.baihongyu.com/