给定一个旋转排序数组,在原地恢复其排序。
说明
什么是旋转数组?
- 比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
样例
1、我的刚开始的解法(比较复杂)
[4, 5, 1, 2, 3]
-> [1, 2, 3, 4, 5]
class Solution {
public:
/*
* @param nums: An integer array
* @return: nothing
*/
void recoverRotatedSortedArray(vector<int> &nums) {
// write your code here
//假设所给数组为[4, 5, 1, 2, 3]
int i;
//找到5的位置
for(i=0;i<nums.size()-1;i++)
{ if(nums[i]>nums[i+1])
break;
}
//如果i等于数组长减一,证明没有旋转
if (i ==nums.size()-1) {
return;
}
int j;
//实现[4, 5, 1, 2, 3]——>[4, 5, 1, 2, 3, 4, 5]
for(j=0;j<=i;j++)
nums.push_back(nums[j]);
int k=i+1;
j=0;
//实现[4, 5, 1, 2, 3, 4, 5]——>[1,2, 3, 4, 5, 4, 5]
while(k<nums.size())
nums[j++]=nums[k++];
//删除尾部多余部分[1,2, 3, 4, 5, 4, 5]——>[1,2, 3, 4, 5]
while(i-->-1)
nums.pop_back();
}
};
2、利用vector容器中的a.erase(q)函数(q为一个迭代器,删除q指向的元素,返回一个指向q后面的元素的迭代器)
class Solution {
public:
/*
* @param nums: An integer array
* @return: nothing
*/
void recoverRotatedSortedArray(vector<int> &nums) {
// write your code here
//假设所给数组为[4, 5, 1, 2, 3]
int i;
//找到5的位置
for(i=0;i<nums.size()-1;i++)
{ if(nums[i]>nums[i+1])
break;
}
//如果i等于数组长减一,证明没有旋转
if (i ==nums.size()-1) {
return;
}
int j;
//实现[4, 5, 1, 2, 3]——>[1, 2, 3, 4, 5]
for(j=0;j<=i;j++)
{ nums.push_back(nums[0]);
nums.erase(nums.begin());}
}
};