旋转数组
题目要求
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
题目出处:
LeetCode官方推出的的经典面试题目清单-初级算法 - 帮助入门 - 数组 - 第三题。
参考答案一
利用reverse函数做三次反转即可。
void rotate(std::vector<int> &nums, int k)
{
int size_num = nums.size();
k = k % size_num;
std::reverse(nums.begin(), nums.end());
std::reverse(nums.begin(), nums.begin() + k);
std::reverse(nums.begin() + k, nums.end());
}
如nums = {0,1,2,3,4,5,6,7,8,9} k =3
第一次反转结果:9 8 7 6 5 4 3 2 1 0
第二次反转结果:7 8 9 6 5 4 3 2 1 0
第三次反转结果:7 8 9 0 1 2 3 4 5 6
答案二(运行超时)
void rotate(std::vector<int> &nums, int k)
{
if(k<=0 || nums.empty())
return;
int num_size = nums.size();
int step = k%num_size;
int num_tem1 = 0;
for(int i=0;i<step;i++)
{
num_tem1 = nums[num_size-1];
for(int j=num_size-1;j>0;j--)
{
nums[j] = nums[j-1];
}
nums[0]=num_tem1;
}
}