0201leetcode刷题5道python

167

题目描述:
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

示例:
在这里插入图片描述
解答:

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left=0
        right=len(numbers)-1
        while left<right:
            if numbers[left]+numbers[right]==target:
                return [left+1,right+1]
            elif numbers[left]+numbers[right]<target:
                left=left+1
            else:
                right=right-1

212

题目描述:
给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。
单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例:
在这里插入图片描述
解答:

class Solution:
    def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
        res = set()
        if len(board) < 1 or len(words) < 1:
            return []

        trie = Trie()
        for word in words:
            trie.insert(word)
        
        n = len(board)
        m = len(board[0])

        def backtrack(i, j, tmp, flags, node):
            if node.get("is_word", False):
                res.add(tmp[:])
            for x, y in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
                ii = i + x
                jj = j + y
                if 0 <= ii < n and 0<=jj < m and flags[ii][jj] == 0 and board[ii][jj] in node.keys():
                    flags[ii][jj] = 1
                    backtrack(ii, jj, tmp + board[ii][jj], flags, node[board[ii][jj]])
                    flags[ii][jj] = 0
            return 
        
        for i in range(n):
            for j in range(m):
                if board[i][j] in trie.root.keys():
                    flags = [[0]*m for _ in range(n)]
                    flags[i][j] = 1
                    node = trie.root[board[i][j]]
                    backtrack(i, j, board[i][j], flags, node)
                    
        return list(res)

class Trie:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.root = {
    
    }
        
    def insert(self, word: str) -> None:
        """
        Inserts a word into the trie.
        """
        node = self.root
        for s in word:
            if s in node.keys():
                node = node[s]
            else:
                node[s] = {
    
    }
                node = node[s]
        node["is_word"] = True

617

题目描述:
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例:
在这里插入图片描述
解答:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
        if t1 and t2:
            t1.val+=t2.val
            t1.left=self.mergeTrees(t1.left,t2.left)
            t1.right=self.mergeTrees(t1.right,t2.right)
            return t1
        return t1 or t2

888

题目描述:
爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。

示例:
在这里插入图片描述
解答:

class Solution:
    def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
        '''
        sum(A)+y-x=sum(B)-y+x
        sum(A)-sum(B)=2(x-y)
        (x-y)=(sum(A)-sum(B))//2
        x是A中元素,y是B中元素
        '''
        dif=(sum(A)-sum(B))//2
        s=set(B)
        for x in A:
            y=x-dif
            if y in s:
                return [x,y]

1496

题目描述:
给你一个字符串 path,其中 path[i] 的值可以是 ‘N’、‘S’、‘E’ 或者 ‘W’,分别表示向北、向南、向东、向西移动一个单位。
机器人从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。
如果路径在任何位置上出现相交的情况,也就是走到之前已经走过的位置,请返回 True ;否则,返回 False 。

示例:
在这里插入图片描述

解答:

扫描二维码关注公众号,回复: 12498613 查看本文章
class Solution:
    def isPathCrossing(self, path: str) -> bool:
        x,y=0,0
        ret=[(0,0)]
        for i in path:
            if i=='N':
                y+=1
            elif i=='S':
                y-=1
            elif i=='E':
                x+=1
            elif i=='W':
                x-=1
            if (x,y) in ret:
                return True
            else:
                ret.append((x,y))
        return False

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113454708