文章

189. 轮转数组

问题189 轮转数组 ★☆☆☆☆

https://leetcode-cn.com/problems/rotate-array/

这个题目比较直接的想法就是把右侧的k个元素暂存下来,右移处理左侧len-k个元素,这样左侧空出k个位置,再把暂存的右侧k个元素填补上即可。这种处理方法的空间复杂度是O(N).

如果期望以O(1)的空间复杂度来解决呢?简单一点的办法是每次右移1个元素,操作k次即可。

有没有更好的办法呢?额,对于连续reverse这种解决方法,背下来好了……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
	public void rotate(int[] nums, int k) {
		int len = nums.length;
		if (len == 0) {
			return;
		}

		k = k % len;
		if (k == 0) {
			return;
		}

		// reverse left len-k elements
		reverse(nums, 0, len - k - 1);

		// reverse right k elements
		reverse(nums, len - k, len - 1);

		// reverse all elements
		reverse(nums, 0, len - 1);
	}

	private void reverse(int[] nums, int left, int right) {
		for (int i = left, j = right; i < j; i++, j--) {
			int tmp = nums[i];
			nums[i] = nums[j];
			nums[j] = tmp;
		}
	}

在 LeetCode 查看

本文由作者按照 CC BY 4.0 进行授权