7月21日打卡
今天目前写了爬楼梯的三道题目,以及合并有序的链表:最后附有代码
#爬楼梯 三个题目
#(1)普通爬楼梯 每次只能走一个台阶或者两个台阶
#(2)加条件:爬两个台阶之后只能走两个连续的一个台阶
#(3)加条件:怕两个台阶之后只能走一个台阶
自己的感悟:首先就是画图很重要,需要把这个转换的图画出来,如下图所示,这样才更容易写出来:
(2)的图:
(3)的图:
然后的话,自己在写代码的过程中出现的问题:
1.dp[0][0]=1写成了dp[0]=1
2.dp[i][1]=dp[i-2][0] if i-2>=0 else 0 这里注意应该是i-2的自由态 走了两步 然后走到了 i 的限制1的状态 ;
dp[i][1]=dp[i-2][0] if i-2>=0 else 0 同理,这个也是i-2的自由态 走了两步 然后走到了i 的 下一步智能走1的状态
完整的代码如下:
(1)--------------------------------------------
class Solution:
def climbStairs(self, n: int) -> int:
a,b=1,1
for i in range(n-1):
a,b=b,a+b
return b
(2)--------------------------------------------
class Solution:
def climbStairs(self, n: int) -> int:
if n==1:
return 1
dp=[[0,0,0] for _ in range(n+1)]
dp[0][0]=1
for i in range(1,n+1):
dp[i][0]=dp[i-1][0]+dp[i-1][2]
dp[i][1]=dp[i-2][0] if i-2>=0 else 0
dp[i][2]=dp[i-1][1]
return sum(dp[n])
(3)--------------------------------------------
class Solution:
def climbStairs(self, n: int) -> int:
if n==1:
return 1
dp=[[0,0,0] for _ in range(n+1)]
dp[0][0]=1
for i in range(1,n+1):
dp[i][0]=dp[i-1][0]+dp[i-1][1]
dp[i][1]=dp[i-2][0] if i-2>=0 else 0
return sum(dp[n])
合并有序的链表:
思路就是递归调用,比较简单,在写的过程中出现了一点问题就是:
比较两个链表的第一个值的时候要写l1.val<l2.val而不是l1<l2
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
if not list1:
return list2
if not list2: return list1
if list1.val<list2.val:
list1.next=self.mergeTwoLists(list1.next,list2)
return list1
else:
list2.next=self.mergeTwoLists(list1,list2.next)
return list2
