双指针算法
练习题
- 141环形链表

方法一
解题思路
使用hash集合,把每一个节点都存入进去,迭代的时候查询该节点是否已经存在,如果存在,则是回环链表,否在不是
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
d = set()
now = head
while now:
if now in d:
return True
d.add(now)
now = now.next
return False
方法二
解题思路
使用快慢双指针的方式,设置一个指针每次直走一个节点,另一个指针每次走两个节点,如果在后面两个指针相遇,则是回环链表
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
s = head
f = head
while f:
try:
s = s.next
f = f.next.next
except:
return False
if s == f:
return True
return False
- 881救生艇

这道题我没有独立解开,是看了力扣上其他人的题解才弄懂的
使用对撞双指针的方式可以解答。在循环遍历之前,需要把数组变成有序的。这时候需要获得最少船只带走全部人,并且每艘船只能坐两个人。那么最大值加上最小值这样的匹配,就是最优解。
解法一:
class Solution:
def numRescueBoats(self, people: List[int], limit: int) -> int:
n = 0
people.sort()
l, r = 0, len(people) - 1
while l <= r:
if people[l] + people[r] <= limit:
l += 1
r -= 1
n += 1
return n
解法二:
和解法一有些不同的是,解法二把两个一起乘船的人看成一个人,所以总人数构成成分为单人船只+(2*两人船只)。所以就可以得到单人船只+两人船只+两人船只。而需要的最小船只数为单人船只+两人船只。所以就有总人数-两人船只=所需最小船只数
class Solution:
def numRescueBoats(self, people: List[int], limit: int) -> int:
people.sort()
l, r = 0, len(people) - 1
while l < r:
if people[l] + people[r] <= limit:
l += 1
r -= 1
return len(people) - l

浙公网安备 33010602011771号