給你乙個無序的陣列 nums, 將該數字 原地 重排後使得 nums[0] <= nums[1] >= nums[2] <= nums[3]...。
示例:輸入: nums = [3,5,2,1,6,4]
輸出: 乙個可能的解答是 [3,5,1,6,2,4]
第一種思路:
雖然題目要求原地,但是我們可以先想乙個簡單的非原地版本出來幫助思考。
class solution(object):
def wigglesort(self, nums):
""":type nums: list[int]
:rtype: none do not return anything, modify nums in-place instead.
"""if not nums:
return nums
nums.sort()
if len(nums) % 2 == 0:
nums[:] = self.solution1(nums)
else:
nums[:] = self.solution2(nums)
def solution1(self, nums):
res = [nums[len(nums) // 2 - 1]]
n = len(nums)
flag = 1
l1, l2 = nums[:len(nums) // 2 - 1][::-1], nums[len(nums)//2 : ]
while len(res) < n:
if not flag:
flag = 1
else:
flag = 0
return res
def solution2(self, nums):
# 1 2 3 4 5
res = [nums[len(nums) // 2]]
n = len(nums)
flag = 1
l1, l2 = nums[:len(nums) // 2][::-1], nums[len(nums)//2:]
while len(res) < n:
if not flag:
flag = 1
else:
flag = 0
return res
第二種思路:
原地排序,線性掃瞄,如果跟後一項不滿足對應的大小關係,就把當前元素和後一元素交換。
class solution(object):
def wigglesort(self, nums):
""":type nums: list[int]
:rtype: none do not return anything, modify nums in-place instead.
"""if not nums:
return nums
i = 0
while i < len(nums):
if i % 2 == 0 and i < len(nums) - 1 and nums[i] > nums[i + 1]:
nums[i], nums[i + 1] = nums[i + 1], nums[i]
elif i % 2 and i < len(nums) - 1 and nums[i] < nums[i + 1]:
nums[i], nums[i + 1] = nums[i + 1], nums[i]
else:
i += 1
return nums
leetcode,python2 最大子序和
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。class so...
LeetCode Python 打家劫舍I
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode Python編碼練習
貪心演算法 1.環形路上有n個加油站,第i個加油站的汽油量是gas i 你有一輛車,車的油箱可以無限裝汽油。從加油站i走到下乙個加油站 i 1 花費的油量是cost i 你從乙個加油站出發,剛開始 的時候油箱裡面沒有汽油。求從哪個加油站出發可以在環形路上走一圈。返回加油站的下標,如果沒有答案的話返回...