思路:
1.需要O(n)的事件复杂度,所以多次循环不考虑
2.四步翻转法
-第一步,找到数组里最小的那个数字,因为是旋转排序数组,所以只要找到某个位置arr[i]>arr[i+1]的话,就找到了那个位置,arr[i+1]就是整个数组里最小的数字
-第二步,找到最小数字的位置后将index到i的前面的部分的数字翻转,比如[4,5,6,7,1,2,3]为例,翻转[4,5,6,7],则得到[7,6,5,4].
-第三步,翻转剩下的部分[1,2,3],则变成[3,2,1]
-第四步,全部翻转,则[7,6,5,4,3,2,1]变成[1,2,3,4,5,6,7]
void recoverRotatedSortedArray(vector<int> &nums) { // write your code here int pos = 1, len = nums.size(); for(;(pos < len) && (nums[pos] >= nums[pos-1]); ++pos);//注意'='号 if(pos == len)// iterate一周后发现其实已经是顺序排序 return; rotateArray(nums, 0, pos); rotateArray(nums, pos, len); rotateArray(nums, 0, len); } void rotateArray(vector<int> &nums, int begin, int end){ for(int i = begin, j = end - 1; i < j; ++i, --j) swap(nums[i], nums[j]); }