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)])

121. 买卖股票的最佳时机

解法:动态规划,利用一次循环,每次循环找出当前坐标往前的最小元素的坐标(不包括当前元素),然后算出当前利润,再和最大值比较。

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

 

Logo

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

更多推荐