1.爬楼梯(70)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
思路:动态规划(将大问题分解成小问题)
假设我们现在站在台阶i上面。对于我们如何到达的i,有且仅有两种可能:
- 我们之前在台阶i−1上面,然后用一步走到了台阶i上面;
- 我们之前在台阶i−2上面,然后用两步走到了台阶i上面。
设函数f(i)为到达iii的所有可能的方法数量。则有
- f(i)=f(i−1)+f(i−2)
class Solution:
def climbStairs(self, n: int) -> int:
f = [1,2]
for i in range(2,n):
f.append(f[i-1]+f[i-2])
return f[n-1] #列表是从0开始的
知识点:append() 方法用于在列表末尾添加新的对象。list.append(obj)
定义一个一定数目、特定元素的列表: a = [0]*(3) >>> a= [0,0,0]
参考链接:https://leetcode-cn.com/problems/climbing-stairs/solution/solution-python3-by-bu-zhi-dao-gan-sha/
2.删除排序链表中的重复元素(83)
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
思路:
- 指定 cur 指针指向头部 head
- 当 cur 和 cur.next 的存在为循环结束条件,当二者有一个不存在时说明链表没有去重复的必要了
- 当 cur.val 和 cur.next.val 相等时说明需要去重,则将 cur 的下一个指针指向下一个的下一个,这样就能达到去重复的效果
- 如果不相等则 cur 移动到下一个位置继续循环
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
cur = head
while cur != None and cur.next !=None:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
3.合并两个有序数组(88)
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
思路:从后往前遍历数组
双指针:p1指向nums1的末尾,p2指向nums2的末尾,p指向两者元素相加的末尾。比较p1与p2的值,谁大就放在后面。大值的对应指针前移。终止条件为p1和p2均大于0.
当出现以p1<0结束的时候,需要将p2中剩下的值,都拷贝在nums1对应的位置。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# for i in range(n):
# nums1[m+i] = nums2[i]
# nums1[:] = sorted(nums1[0:m+n]) + (len(nums1)-m-n)*[0]
p1 = m - 1
p2 = n - 1
p = m + n - 1
while p1 >= 0 and p2 >= 0:
if nums1[p1] < nums2[p2]:
nums1[p] = nums2[p2]
p2 -=1
else:
nums1[p] = nums1[p1]
p1 -=1
p-=1
nums1[:p2+1] = nums2[:p2+1]
知识点:双指针遍历数组比较大小,找到终止条件。并考虑到结束时特殊情况。
sorted() 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。list 的 sort 方法返回的是对已经存在的列表进行操作.
另一种暴力解法:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
for i in range(n):
nums1[m+i] = nums2[i]
nums1[:] = sorted(nums1[0:m+n]) + (len(nums1)-m-n)*[0]
注意: 如果sorted(list1)以后,仍然想把值复制给list1,需要写list1[:] = sorted(list1) 而不是写list1 = sorted(list1)