【发布时间】:2015-09-19 09:48:12
【问题描述】:
我有以下问题要测试:
将
n元素数组向右旋转k步。例如,对于
n = 7和k = 3,数组[1,2,3,4,5,6,7]被旋转为[5,6,7,1,2,3,4]。你知道有多少种不同的方法可以解决这个问题?
我在中间数组中的解决方案:
空间是O(n),时间是O(n),我可以创建一个新数组,然后将元素复制到新数组。然后使用System.arraycopy()更改原始数组。
public void rotate(int[] nums, int k) {
if (k > nums.length)
k = k % nums.length;
int[] result = new int[nums.length];
for (int i = 0; i < k; i++) {
result[i] = nums[nums.length - k + i];
}
int j = 0;
for (int i = k; i < nums.length; i++) {
result[i] = nums[j];
j++;
}
System.arraycopy(result, 0, nums, 0, nums.length);
}
但是有没有更好的方法可以在O(1) 空间中使用冒泡旋转(如冒泡排序)来实现?
【问题讨论】:
-
你确定“在n = 5和k = 2的情况下,数组[1,2,3,4,5,6,7]旋转到[5,6,7,1 ,2,3,4]" 正确吗?该数组中的元素似乎超过 5 个?
-
我不知道
n = 5和k = 2如何给出您在问题中显示的输出。 -
不应该是“n = 7 and k = 3”吗?
-
我最喜欢解决这个问题的方法是编程珍珠中描述的方法,您可以反转整个数组,然后反转子部分。更多信息在这里:articles.leetcode.com/2010/04/rotating-array-in-place.html
标签: java arrays sorting optimization time-complexity