Leetcode做题日记
思路:从后往前,一开始2个数字为一组,若最前面的数字小于等于后面任一一个数字,则从中挑中第二小的数字,并与最前面的数字交换顺序,并对后面的数字从小到大排序,反之则将指针往前。 python 实现
·
31. 下一个排列
思路:从后往前,一开始2个数字为一组,若最前面的数字小于等于后面任一一个数字,则从中挑中第二小的数字,并与最前面的数字交换顺序,并对后面的数字从小到大排序,反之则将指针往前。
Python实现:
class Solution(object):
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
j = len(nums) - 1 #指向最后一个元素
i = j - 1 #指向倒数第二个元素
mini = nums[j] #最大的元素
sec_mini = nums[j] #找出第二小元素
while i >= 0 and nums[i] >= mini :
i -= 1
j -= 1
mini = max(nums[j:len(nums)])
if i < 0: #这种情况为数组从第一个元素开始为降序,如[3,2,1]
nums[:len(nums)] = sorted(nums)
return
mini = 1000
sec_mini = 1000
sec_p = -1
for k in range(i,len(nums)):
if nums[k] >= nums[i]:
if nums[k] <= mini:
mini = nums[k]
elif nums[k] <= sec_mini:
sec_mini = nums[k]
sec_p = k
#交换 sec_p 和 i
tmp = nums[sec_p]
nums[sec_p] = nums[i]
nums[i] = tmp
nums[j:len(nums)] = sorted(nums[j:len(nums)])
解法:动态规划,利用一次循环,每次循环找出当前坐标往前的最小元素的坐标(不包括当前元素),然后算出当前利润,再和最大值比较。
Python实现:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) == 1:
return 0
maxi = -1
mini_p = 0
for i in range(1, len(prices)):
if prices[i] < prices[mini_p]:
mini_p = i
else:
if maxi < (prices[i]-prices[mini_p]):
maxi = (prices[i]-prices[mini_p])
return maxi if maxi > 0 else 0

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)