版權聲明:轉載請聯系本人,感謝配合!本站位址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50600861
翻譯
通過K步将一個有着n個元素的數組旋轉到右側。
例如,
給定n = 7和k = 3,數組[1,2,3,4,5,6,7]會被旋轉成[5,6,7,1,2,3,4]。
批注:
盡你可能嘗試多種解決方案,這裡至少存在3種不同的方式去解決這個問題。
原文
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
分析
第一種方法
我所想到的第一種方式是另設定一個vector,然後逐個元素添加進去,最後将這個vector指派給nums。添加方式為将右邊的k個元素添加進去,再将左邊的n-k個元素添加進去。
具體代碼為:
void rotate(vector<int> &nums, int k) {
if (nums.size() == 1) return;
if (k > nums.size()) k %= nums.size();
vector<int> newNums;
for (int i = nums.size() - k; i < nums.size(); ++i)
newNums.push_back(nums[i]);
for (int i = 0; i < nums.size() - k; ++i)
newNums.push_back(nums[i]);
nums = newNums;
}
Runtime: 28 ms
逾時方法
還有一個最簡單的方法,不過妥妥的逾時了……
void rotate(vector<int> &nums, int k) {
if (nums.size() <= 1) return;
if (k > nums.size()) k %= nums.size();
while (k > 0) {
int temp = nums[nums.size() - 1];
for (int i = nums.size() -1; i >0; --i) {
nums[i] = nums[i - 1];
}
nums[0] = temp;
k--;
}
}
Time Limit Exceeded
第二種方法
上面那種方法不行,繼續改進第一種方法。同樣是将vector切成左右兩邊。
void rotate(vector<int> &nums, int k) {
if (nums.size() <= 1) return;
if (k > nums.size()) k %= nums.size();
vector<int> extra(nums.begin(), nums.begin() + nums.size() - k);
nums.erase(nums.begin(), nums.begin() + nums.size() - k);
nums.insert(nums.end(), extra.begin(), extra.end());
}
Runtime: 28 ms
第二種方法改進
試試颠倒順序呢?
void rotate(vector<int> &nums, int k) {
if (nums.size() <= 1) return;
if (k > nums.size()) k %= nums.size();
vector<int> extra(nums.end() - k, nums.end());
nums.erase(nums.end() - k, nums.end());
nums.insert(nums.begin(), extra.begin(), extra.end());
}
Runtime: 24 ms
要少了4秒呢。
第三種方法
還有一種方法,可以使用STL自帶的rotate()函數……
void rotate(vector<int>& nums, int k) {
int len = nums.size();
if (len > 1) {
k %= len;
std::rotate(nums.begin(), nums.end() - k, nums.end());
}
}