Recover Rotated Sorted Array
Question
- lintcode: (39) Recover Rotated Sorted Array
Given a rotated sorted array, recover it to sorted array in-place.
Example
[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]
Challenge
In-place, O(1) extra space and O(n) time.
Clarification
What is rotated array:
- For example, the orginal array is [1,2,3,4], The rotated array of it can be [1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
首先可以想到逐步移位,但是这种方法显然太浪费时间,不可取。下面介绍利器『三步翻转法』,以[4, 5, 1, 2, 3]
为例。
- 首先找到分割点
5
和1
- 翻转前半部分
4, 5
为5, 4
,后半部分1, 2, 3
翻转为3, 2, 1
。整个数组目前变为[5, 4, 3, 2, 1]
- 最后整体翻转即可得
[1, 2, 3, 4, 5]
由以上3个步骤可知其核心为『翻转』的in-place实现。使用两个指针,一个指头,一个指尾,使用for循环移位交换即可。
class Solution:
"""
@param nums: The rotated sorted array
@return: nothing
"""
def recoverRotatedSortedArray(self, nums):
# write your code here
if nums==None:
return
numslen = len(nums)
for index in range(numslen-1):
if(nums[index]>nums[index+1]):
self.reverse(nums,0,index)
self.reverse(nums,index+1,numslen-1)
self.reverse(nums,0,numslen-1)
def reverse(self,nums,start,end):
while start<end:
nums[start],nums[end]=nums[end],nums[start]
start+=1
end-=1
'''
def swap(self,nums,start,end):
tmp = nums[start]
nums[start] = nums[end]
nums[end] = tmp
'''
sol = Solution()
nums = [4, 5, 1, 2, 3]
sol.recoverRotatedSortedArray(nums)