滑动窗口——X庸置疑

要点:连续、无重复、 子串 步骤:窗口右边随循环扩张,待到右边元素存在窗口内时调整左窗口直到右边子元素不存在于窗口中,每次迭代更新子串长度

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        char_set = set()#保留窗口内的不重复子串
        left = 0
        max_len = 0
        for right in range(len(s)):
            while s[right] in char_set:
                char_set.remove(s[left])
                left += 1
            char_set.add(s[right])
            max_len = max(max_len,right-left+1)
        return max_len

逆转链表——头插法解决 or 双指针逆反

头插,一定是新插入的在最前面

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        fake_head = ListNode(-1)
        fake_head.next = None
        #前插法
        p = head
        while p:
            temp = fake_head.next
            temp1 = p.next
            fake_head.next = p
            p.next = temp
            p = temp1
        return fake_head.next

p1、p2的状态, p1最终指向None, p2最终指向 新头节点; 该解法关注p1、p2的init状态、状态走向以及最终指代即可。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        p1 = head
        p2 = None
        while p1:
            temp = p1.next
            p1.next = p2
            p2 = p1
            p1 = temp
        return p2

第k大的数

用小根堆,考数据结构,没想到 python默认小根堆,这里操作很诡异,还要自备容器。

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        heap = []
        for num in nums:
            heapq.heappush(heap,num)
            if len(heap) > k:
                heapq.heappop(heap)
        return heap[0]

k组逆转——断舍离有难度

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseKGroup(self, head, k):
        """
        :type head: Optional[ListNode]
        :type k: int
        :rtype: Optional[ListNode]
        """
    #嵌套式逆转
        if not head or k == 1:
            return head
        dummy = ListNode(-1)
        dummy.next = head
        group_prev = dummy

        while True:
            kth = group_prev
            for _ in range(k):
                kth = kth.next
                if not kth:
                    return dummy.next
            group_next = kth.next
            kth.next = None
            group_head = group_prev.next

            head_new = self.reverseList(group_head)

            #join
            group_prev.next = head_new
            group_head.next = group_next

            group_prev = group_head

        return dummy.next

    def reverseList(self,head):
        prev = None
        cur = head
        while cur:
            temp = cur.next
            cur.next = prev
            prev = cur
            cur = temp
        return prev