双指针算法

练习题

  1. 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
  1. 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
posted @ 2022-08-12 16:04  影梦无痕  阅读(21)  评论(0)    收藏  举报