翻转
var rotate = function (nums, k) {
let len = nums.length
k = k % len
reverse(nums, 0, len - 1)
reverse(nums, 0, k - 1)
reverse(nums, k, len - 1)
};
var reverse = function (nums, start, end) {
while (start < end) {
// swap
[nums[start], nums[end]] = [nums[end], nums[start]]
start++
end--
}
}
-
时间复杂度:
O(n),其中n是数组的长度。每次翻转都需要遍历数组的一部分,总共三次翻转,因此时间复杂度为O(n)。 -
空间复杂度:
O(1),不需要额外的空间,仅仅是原地修改数组。
耿直超时写法
var rotate = function (nums, k) {
var oneRound = function () {
let last = nums[nums.length - 1];
for (let i = nums.length - 1; i > 0; --i) {
nums[i] = nums[i - 1];
}
nums[0] = last;
};
for (let i = 0; i < k; ++i) {
oneRound();
}
};
“原地”操作
空间复杂度为O(n)
var rotate = function (nums, k) {
let n = nums.length;
let res = new Array(n);
for (let i = 0; i < n; ++i) {
res[(i + k) % n] = nums[i];
}
for (let i = 0; i < n; ++i) {
nums[i] = res[i];
}
};