这篇文章讲解的是LintCode第39题:Recover Rotated Sorted Array
Example
Example1:
[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]
Example2:
[6,8,9,1,2] -> [1,2,6,8,9]
首先找到第一个比后面的数大的数的索引。把这个数组中索引的前半部分反转,再把后半部分反转,再全部反转:
class Solution:
"""
@param nums: An integer array
@return: nothing
"""
def recoverRotatedSortedArray(self, nums):
# write your code here
if not nums:
return
for i in range(len(nums) - 1):
if nums[i] > nums[i + 1]:
self.reverse(nums, 0, i)
self.reverse(nums, i + 1, len(nums) - 1)
self.reverse(nums, 0, len(nums) - 1)
def reverse(self, nums, start, end):
while start < end:
nums[start], nums[end] = nums[end], nums[start]
start += 1
end -= 1
这题和第8题: Rotate String 很类似,不过后者的offset可能会大于数组长度,因此需要取余再来求索引:
class Solution:
"""
@param str: An array of char
@param offset: An integer
@return: nothing
"""
def rotateString(self, s, offset):
# write your code here
if not s:
return
offset = offset % len(s)
self.reverse(s, 0, len(s) - 1)
self.reverse(s, 0, offset - 1)
self.reverse(s, offset, len(s) - 1)
def reverse(self, nums, start, end):
while start < end:
nums[start], nums[end] = nums[end], nums[start]
start += 1
end -= 1