1)题目
恢复旋转排序数组
要求:
给定一个旋转排序数组,在原地恢复其排序。(升序)
样例:
输入:
[4, 5, 1, 2, 3]
输出:
[1, 2, 3, 4, 5]
2)补充知识
旋转数组定义:
原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]。
vector有内部函数实现排序(升序或降序),注意 sort 需要头文件 #include
升序:
sort(obj.begin(),obj.end());//从小到大
降序:
reverse(obj.begin(),obj.end());//从大到小 将排序好的逆序
vector常用操作总结
3)思路
需要求第一个后者比前者小时,后者的下标,即offset。然后即可使用旋转vector的方法来做了。
4)代码
class Solution {
public:
/**
* @param nums: An integer array
* @return: nothing
*/
//利用offset实现
void recoverRotatedSortedArray(vector<int> &nums) {
// write your code here
int offset = getOffset(nums);
reverse(nums.begin(), nums.begin() + offset);//将前半部分逆序
reverse(nums.begin() + offset, nums.end());//将后半部分逆序
reverse(nums.begin(), nums.end());//将整体逆序
}
//利用vector内部函数实现
void recoverRotatedSortedArray_vector(vector<int> &nums)
{
sort(nums.begin(), nums.end());//升序
reverse(nums.begin(), nums.end());//降序
}
private:
int getOffset(vector<int> & nums) {
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] < nums[i - 1]) {
return i;
}
}
return 0;
}
};