给定一个旋转排序数组,在原地恢复其排序。(升序)
样例
Example1:[4, 5, 1, 2, 3]
-> [1, 2, 3, 4, 5]
Example2:[6,8,9,1,2]
-> [1,2,6,8,9]
挑战
使用O(1)的额外空间和O(n)时间复杂度
说明
什么是旋转数组?
比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
解题思路:
1、因为旋转后的数组近乎有序,所以我使用了插入排序。
class Solution {
public:
/*
* @param nums: An integer array
* @return: nothing
*/
void recoverRotatedSortedArray(vector<int> &nums)
{
// write your code here
for(int i=1;i<nums.size();i++)
{
for(int j=i;j>0;j--)
{
if(nums[j]<nums[j-1])
{
swap(nums[j],nums[j-1]);
}
else break;
}
}
}
};
2、先找到第一个比后面的数大的数,也就是分界线,然后分别旋转两边元素,最后整体旋转即可。
public class Solution {
/**
* @param nums: An integer array
* @return: nothing
*/
public void recoverRotatedSortedArray(List<Integer> nums) {
// write your code here
if(nums.get(0) < nums.get(nums.size()-1))
return;
找到第一个比后面的数大的数,序号为mid
int mid = 0;
for(int i=0; i<nums.size()-1; i++){
if(nums.get(i) > nums.get(i+1)){
mid = i;
break;
}
}
//三次旋转法
reverse(nums, 0, mid);
reverse(nums, mid+1, nums.size()-1);
reverse(nums, 0, nums.size()-1);
}
public void reverse(List<Integer> nums, int start, int end){
for (int i = start, j = end; i < j; i++, j--) {
int temp = nums.get(i);
nums.set(i, nums.get(j));
nums.set(j, temp);
}
}
}