39. 恢复旋转排序数组
给定一个旋转排序数组,在原地恢复其排序。
样例
[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]
挑战
使用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:
三步翻转法:
"""
三步反转法
找到两个rotated的数组的间隔点,条件:nums[i] > nums[i+1]
反转[0,i+1]的数组
反转[i+1,size]的数组
反转[0,size]的数组
数组就变成的有序的数组
"""
class Solution:
"""
@param nums: An integer array
@return: nothing
"""
def recoverRotatedSortedArray(self, nums):
# write your code here
l = len(nums)
if l == 0:
return -1
for i in range(l - 1):
if nums[i] > nums[i + 1]:
self.reverse(nums, 0, i)
self.reverse(nums, i + 1, l - 1)
self.reverse(nums, 0, l - 1)
return nums
#反转任何数组,无论大小等顺序关系,反转区间是start -- end
def reverse(self, nums, start, end):
while start < end:
nums[start], nums[end] = nums[end], nums[start]
start += 1
end -= 1
my_solution = Solution()
#nums = [5, 6, 1, 2, 3,4]
nums = [3,4,1,2]
reversed_nums = my_solution.recoverRotatedSortedArray(nums)
print(reversed_nums)
方法2:
霸气Python,让你服
sort是直接在原数组上排序,sorted是返回排序后的结果
对于一个无序的列表a,调用a.sort(),对a进行排序后返回a,sort()函数修改待排序的列表内容。
而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。
class Solution:
"""
@param nums: An integer array
@return: nothing
"""
def recoverRotatedSortedArray(self, nums):
# write your code here
return nums.sort()
sort函数和sorted()函数区别
'''
sort()是一个函数,这个函数没有返回值,所以调用这个函数后打印是none,而a这个数组还在,是被拍好序的
sort()没有返回值,是直接在原数组上操作,也就是说,原数组(nums, nums_2)被排序了
题目中的要求是,要直接在原数组中排序,而不是返回排序后的结果
sort是直接在原数组上排序,sorted是返回排序后的结果
对于一个无序的列表a,调用a.sort(),对a进行排序后返回a,sort()函数修改待排序的列表内容。
而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。
'''
nums = [5, 6, 1, 2, 3,4]
original_nums = nums.sort()
print(original_nums)
print(nums) #sort()是一个函数,这个函数没有返回值,所以调用这个函数后打印是none,而a这个数组还在,是被拍好序的
nums_2 = [4,5,1,2,3]
print(nums_2.sort())
b = sorted(nums)
print(b)
输出
None
[1, 2, 3, 4, 5, 6]
None
[1, 2, 3, 4, 5, 6]
[Finished in 0.0s]
1
微信扫一扫
关注该公众号