美文网首页
leetcode做题记录

leetcode做题记录

作者: MR来了 | 来源:发表于2021-03-17 16:57 被阅读0次

目录

  • 动态规划:不同的子序列

  • 优先队列:最大平均通过率

  • 先进后出:逆波兰表达式求值

  • 递归解决:杨辉三角,扁平化嵌套列表迭代器(深度优先),删除排序链表中的重复元素

  • 链表操作: 旋转链表

  • 排序比较: 最大数

  • 115. 不同的子序列

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        
        len_row = (len(t))+1
        len_col = (len(s))+1
        dp = [[0] * len_col for _ in range(len_row)]
        ## 初始化 dp[0][j] = 1
        for j in range(len_col):
            dp[0][j] = 1
        
        ## 字符串跟数组是不对应的
        ## 从行遍历
        for i in range(1, len_row):
            ## 从左到右遍历
            for j in range(1, len_col):
                if t[i-1] == s[j-1]:
                    dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
                elif t[i-1] != s[j-1]:
                    dp[i][j] = dp[i][j-1]
        
        return dp[-1][-1]
class Solution:
    def maxAverageRatio(self, classes: List[List[int]], extraStudents: int) -> float:
        ## 优先队列
        ## 每次的增加量
        diff = lambda x, y: (x+1)/(y+1) - x/y
        res  = 0.
        q    = []
        for x, y in classes:
            res += x/y
            q.append((-diff(x,y), x, y))  ## 以增量为记录值
        
        heapq.heapify(q)

        for _ in range(extraStudents):
            d, x, y = heapq.heappop(q) ## 弹出最小值,也就是最大值
            res += -d ## 加入增量, 负数
            heapq.heappush(q, (-diff(x+1, y+1), x+1, y+1)) ## 更新优先队列

        return res/len(classes)
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        if len(tokens) == 1:
            return int(tokens[0])
        import queue
        q_num = queue.LifoQueue(10000)
        def foo(var, x, y):
            #print(var)
            #print(x,y)
            return {
            '+': lambda x,y: x+y,
            '-': lambda x,y: y-x,
            '*': lambda x,y: x*y,
            '/': lambda x,y: int(y/x), 
            }[var](x,y)

        for i in tokens:
            if (i.startswith('-') and i[1:] or i).isdigit():
                q_num.put(int(i))
            else:
                res = foo(i, q_num.get(), q_num.get())
                q_num.put(res)
        return res
                

class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        import functools

        if rowIndex == 0:
            return [1]

        @functools.lru_cache()
        def helper(k):
            if k == 1:
                return [1,1]
            else:
                list1 = [1]
                list0 = helper(k-1)
                for i in range(len(list0)-1):
                    list1.append(list0[i]+list0[i+1])
                list1.append(1)
                return list1
        
        res = helper(rowIndex)
        return res
class Solution:
    def hammingWeight(self, n: int) -> int:
        from collections import Counter
        a = str(bin(n))
        list0 = Counter(a)
        if '1' in list0:
            return list0['1']
        else:
            return 0
class NestedIterator:    
    def __init__(self, nestedList: [NestedInteger]):
        self.queue = []
        ## 深度优先搜索
        def dfs(nestedList):
            for item in nestedList:
                ## 如果是数字
                if item.isInteger():
                    self.queue.append(item.getInteger())
                ## 如果是list,继续递归
                else:
                    dfs(item.getList())
        dfs(nestedList)
    
    ## 记得是pop(0) 默认最后一个元素
    def next(self) -> int:
        return self.queue.pop(0)

    def hasNext(self) -> bool:
        return len(self.queue)
class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        ## 如果是空
        if not head or not head.next:
            return head
        ## 重新更新next值
        if head.val != head.next.val:
            ## 这里面用next,因为head没有变化
            head.next = self.deleteDuplicates(head.next)
        else:
            ## 跳过相同的值,保证下一个next不等于move
            move = head.next
            while move and head.val == move.val:
                move = move.next
            ## 返回新的move,这里面是递归
            return self.deleteDuplicates(move)
        return head
class Solution(object):
    def rotateRight(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        tail = head   
        len1 = 1
        while tail and tail.next:
            len1+=1
            ## 记录最后一个指针
            tail = tail.next

        ## 当元素<=1或者k为0,不需要挪动
        if len1 <= 1 or k == 0:
            return head

        tail.next = head ## 进行闭环

        ## 重新确定要挪动的位置
        k = k%len1
        
        ## 重新构建
        k0 = len1 - k 
        index = 0
        while head:
            index +=1
            if index == k0:
                newHead = head.next
                head.next = None
            head = head.next

        ## 重新结合
        return newHead
class Solution:
    def largestNumber(self, nums: List[int]) -> str:

        ## 自定义排序, python2 跟python3有很大的区别
        from functools import cmp_to_key
        compare = lambda x, y: int(y+x) - int(x+y) 
        
        ## 变成字符串
        nums_str =  list(map(str, nums))
        nums_str.sort(key=cmp_to_key(compare))
        res = "".join(nums_str)
        if res[0] == '0':
            res = '0'
        
        return res

相关文章

网友评论

      本文标题:leetcode做题记录

      本文链接:https://www.haomeiwen.com/subject/vmeecltx.html