力扣日练-day1

1、二叉树的中序遍历 用递归太慢,故使用颜色标记法,和递归思想差不多

white,gray=0,1   #定义标记颜色
res=[]  
stack=[(white,root)]   #记录标记颜色和节点
while stack:
    color,node = stack.pop()  #循环出站遍历栈中节点
    if node is None:continue   #当前节点为空则循环继续
    if color == white:      #当前节点未遍历则将其与左右孩子节点入栈,注意入栈顺序,和遍历方法有关
        stack.append((white,node.right))
        stack.append((gray,node))
        stack.append((white,node.left))
    else:
        res.append(node.val)
return res
    

 

2、对称二叉树的判断 用递归的思路,判断左子树的左孩子是否等于右子树的右孩子,以及左子树的右孩子是否等于右子树的左孩子

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if root is None:
            return True
        return self.func(root.left,root.right)
    def func(self,left:TreeNode,right:TreeNode):
        if left is None and right is None:
            return True
        if left is None or right is None:
            return False
        if left.val != right.val:
            return False
        return self.func(left.left,right.right) and self.func(left.right,right.left)

 

3、二叉树的最大深度 用递归的思路,求左子树的深度和右子树的深度,取两者最大的一个

  注意:递归内部不用定义变量加加减减,重点在return的条件控制,因为每次返回到上一层的时候是return的值

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        leftHeight=self.maxDepth(root.left)
        rightHeight=self.maxDepth(root.right)
        return max(leftHeight,rightHeight)+1

 

4、链表是否有环 很妙的解法,直接修改节点的值进行判断

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        if head is None:
            return False
        h=head
        while h != None:
            if h.val!='':
                h.val=''
            elif h.val=='':
                return True
            h=h.next
        return False
                

 

5、反转二叉树  递归思想,交换每个节点的左右子树

class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        if root == None:
            return None    #递归出口
        root.left,root.right=root.right,root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root    #上面两个递归结束才执行这个

 

6、str.count("x")可以计算str中x出现的次数

7、对于不关注是否有重复数据的数组可以转化为set数据结构提高查找速度

8、异或操作求两个整数x进制不同的位数,二进制为例,bin(x^y).count('1')

9、滑动窗口练习:

  步骤:定义需要维护的变量—>定义窗口start,end—>更新维护变量—>滑动窗口(分为固定窗口和不定窗口两种情况)

  1.求子数组最大平均值

#求子数组最大平均数
class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        sum,max_avg=0,-99999
        start=0
        for end in range(len(nums)):
            sum+=nums[end]
            if end-start+1>=k:
                max_avg=max(max_avg,sum/k)
            if end >=k-1:
                sum-=nums[start]
                start+=1
        return max_avg 
    
    
    
 # Step 1
        # 定义需要维护的变量
        # 本题求最大平均值 (其实就是求最大和),所以需要定义sum_, 同时定义一个max_avg (初始值为负无穷)
        sum_, max_avg = 0, -math.inf

        # Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口
        start = 0
        for end in range(len(nums)):
            # Step 3: 更新需要维护的变量 (sum_, max_avg), 不断把当前值积累到sum_上
            sum_ += nums[end]
            if end - start + 1 == k:
                max_avg = max(max_avg, sum_ / k)

            # Step 4
            # 根据题意可知窗口长度固定,所以用if
            # 窗口首指针前移一个单位保证窗口长度固定, 同时提前更新需要维护的变量 (sum_)
            if end >= k - 1:
                sum_ -= nums[start]
                start += 1
        # Step 5: 返回答案
        return max_avg

 

  2、求不重复最长子串长度

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        #1、定义维护变量,由于需要处理重复数据(当出现重复数据时哈希数组长度小于窗口长度),故需要定义哈希数据结构
        max_len,hashmap=0,{}
        #2、定义窗口头尾
        start=0
        for end in range(len(nums)):
            hashmap[s[end]]=hashmap.get(s[end],0)+1   #不存储重复数据,而是将其出现次数+1
            if len(hashmap)==end-start+1:    #哈希数组长度等于窗口长度,无重复数据
                max_len=max(max_len,end -start+1)
            while len(hashmap)<end-start+1:     #出现重复数据,移动窗口大小
                hashmap[s[start]]-=1
                if hashmap[s[start]]==0:
                    del hashmap[s[start]]
                start+=1
            return max_len

 

posted @ 2022-07-20 23:50  肥余  阅读(40)  评论(0)    收藏  举报