0
点赞
收藏
分享

微信扫一扫

吃掉LeetCode之2022/2/5

月孛星君 2022-02-05 阅读 37

吃掉LeetCode之2022/2/5

目录

121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

代码思路:

感觉应该叫动态规划,但二维动态规划会超时,那么就转化为一维,精简些。
我们让最大利润为今天出售减去以前最小购入,然后维护前面最小购入值就行。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        minn,maxx=1000000,0
        for i in prices:
            if i<minn:minn=i
            if i-minn>maxx:maxx=i-minn
        return maxx

75. 颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。

代码思路:

  1. 单指针,先将0换到前面,在将1换到0后面
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n=len(nums)
        pos=0
        for i in range(n):
            if nums[i]==0:
                nums[i],nums[pos]=nums[pos],nums[i]
                pos+=1
        for i in range(pos,n):
            if nums[i]==1:
                nums[i],nums[pos]=nums[pos],nums[i]
                pos+=1
  1. 双指针,原理和原来差不多,都是维护指针,然后交换
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        pos0 = pos1 = 0
        for i in range(n):
            if nums[i] == 1:
                nums[i], nums[pos1] = nums[pos1], nums[i]
                pos1 += 1
            elif nums[i] == 0:
                nums[i], nums[pos0] = nums[pos0], nums[i]
                if pos0 < pos1:
                    nums[i], nums[pos1] = nums[pos1], nums[i]
                pos0 += 1
                pos1 += 1

64. 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

代码思路:

动态规划,定义dp数组, d p [ i ] [ j ] dp[i][j] dp[i][j]为从第一个到 i , j i,j ij位置的最小路径和,然后状态转移方程为
d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) + g r i d [ i ] [ j ] dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j] dp[i][j]=min(dp[i1][j],dp[i][j1])+grid[i][j]
然后按这个思路处理一下边界就OK了

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        n,m=len(grid),len(grid[0])
        dp=[[100000]*(m+1) for _ in range(n+1)]
        dp[1][1],dp[1][0],dp[0][1]=grid[0][0],0,0
        for i in range(n):
            for j in range(m):
                dp[i+1][j+1]=min(dp[i][j+1],dp[i+1][j])+grid[i][j]
        return dp[n][m]
举报

相关推荐

0 条评论