Day6 环形链表 II 买卖股票的最佳时机 不同路径

环形链表II
和上一个环形链表I类似,设置一个快慢指针,设从head到环形入口有a个节点,环形入口到环形结尾有b个节点,首先快指针一次走两格,慢指针一次走一格,fast=2*slow;其次,fast指针在环形绕了n圈和slow指针相遇,则fast=slow+nb;由上面两个公式,则slow=nb;slow指针想再到环形入口,步数必定为a+nb;则slow指针再走a步就能到达环形入口;但是a不知。可将fast指针指向head,然后fast指针和slow指针都走一格,直到再次相遇时两者指向环形入口。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        fast=head
        slow=head
        while True:
            if not fast or not fast.next:
                return None
            fast=fast.next.next
            slow=slow.next
            # 第一次相遇
            if fast==slow:
                fast=head
                while fast!=slow:
                    fast=fast.next
                    slow=slow.next
                return fast

买卖股票的最佳时机

class Solution(object):
    def maxProfit(self, prices):
        Max=0
        minPrice=1<<31
        for i in range(len(prices)):
            Max=max(Max,prices[i]-minPrice)
            minPrice=min(minPrice,prices[i])
        return Max

不同路径
m行n列,可以直接用排列组合做。路径总数为 C m + n − 1 m − 1 C_{m+n-1}^{m-1} Cm+n1m1,但是m和n的数都比较大,100多吧,直接求组合数不好求,使用dp解决问题。dp[i][j] 表示原点到(i,j)的路径数,只能从左边和上面转移到该模块,则状态转移方程为dp[i][j]=dp[i-1][j]+dp[i][j-1]。

class Solution(object):
    def uniquePaths(self, m, n):
        dp=[[1]*n]+[([1]+[0]*(n-1)) for _ in range(m-1)]
        # dp[i][j] 表示原点到(i,j)的路径数
        for i in range(1,m):
            for j in range(1,n):
                # 状态转移方程
                dp[i][j]=dp[i-1][j]+dp[i][j-1]
        return dp[-1][-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值