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)
class solution:
"""@param nums: an integer array
@return: nothing
"""def recoverrotatedsortedarray(self, nums):
# write your code here
return nums.sort()
'''
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
39 恢復旋轉排序陣列
給定乙個 旋轉排序陣列,在原地恢復其排序。說明什麼是旋轉陣列?樣例 4,5,1,2,3 1,2,3,4,5 1 我的剛開始的解法 比較複雜 class solution 如果i等於陣列長減一,證明沒有旋轉 if i nums.size 1 int j 實現 4,5,1,2,3 4,5,1,2,3,4...
LintCode 39 恢復旋轉排序陣列
給定乙個旋轉排序陣列,在原地恢復其排序。什麼是旋轉陣列?比如,原始陣列為 1,2,3,4 則其旋轉陣列可以是 1,2,3,4 2,3,4,1 3,4,1,2 4,1,2,3 4,5,1,2,3 1,2,3,4,5 使用o 1 的額外空間和o n 時間複雜度 迴圈將頭部放到後面,知道遇到比下乙個值比當...
LintCode 39(恢復旋轉排序陣列)
lintcode系列,第39題,題目 給定乙個旋轉排序陣列,在原地恢復其排序。說明 什麼是旋轉陣列?樣例 樣例1 4,5,1,2,3 1,2,3,4,5 樣例2 6,8,9,1,2 1,2,6,8,9 找到第乙個大於後繼元素的數,以這個數為界,前半部分做一次逆序,後半部分做一次逆序,最後整個陣列再做...