• 【leetcode】Path Sum IV


    If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digits integers.
    
    For each integer in this list:
    The hundreds digit represents the depth D of this node, 1 <= D <= 4.
    The tens digit represents the position P of this node in the level it belongs to, 1 <= P <= 8. The position is the same as that in a full binary tree.
    The units digit represents the value V of this node, 0 <= V <= 9.
    Given a list of ascending three-digits integers representing a binary with the depth smaller than 5. You need to return the sum of all paths from the root towards the leaves.
    
    Example 1:
    Input: [113, 215, 221]
    Output: 12
    Explanation: 
    The tree that the list represents is:
        3
       / 
      5   1
    
    The path sum is (3 + 5) + (3 + 1) = 12.
    Example 2:
    Input: [113, 221]
    Output: 4
    Explanation: 
    The tree that the list represents is: 
        3
         
          1
    
    The path sum is (3 + 1) = 4.

    这个题目比较直接的方法是把二叉树建立起来,然后从根节点开始依次遍历各个叶子节点。这个方案会比较麻烦,因为涉及到回溯等等。更为简便的方法是从叶子节点往根节点遍历,把每个叶子节点遍历到根节点的和累加就行。 

    1. 找出所有的叶子节点。这个比较简单,遍历nums数组的每个元素,假设元素的值是abc,那么只要判断(a+1)(b*2)*或者(a+1)(b*2-1)*在不在nums数组中即可。【b*2中的*表示乘号,括号后面的*表示通配符】

    def IsLeaf(self,nums,node):
            dep = node/100
            pos = (node%100)/10
    
            next = (dep+1)*10 + pos*2
            next2 = (dep+1)*10 + pos*2 -1
            for i in nums:
                if i/10 == next or i/10 == next2:
                    return False
            return True

    2. 找出叶子节点的父节点。这个同理,假设叶子节点的值是假设元素的值是abc,那么其父节点是(a-1)(b/2)*或者是(a-1)((b+1)/2)*。

    def getParent(self,nums,node):
            dep = node/100
            pos = (node%100)/10
            val = (node%100)%10
            for i in nums:
                if i/100 != dep -1:
                    continue
                p = (i%100)/10
                if p*2 == pos or p*2 == pos+1:
                    self.count += (i%100)%10
                    return i
            return node

    3.接下来就是开始求和了。

    完整代码如下:

    class Solution(object):
        count = 0
        def getParent(self,nums,node):
            dep = node/100
            pos = (node%100)/10
            val = (node%100)%10for i in nums:
                if i/100 != dep -1:
                    continue
                p = (i%100)/10
                if p*2 == pos or p*2 == pos+1:
                    self.count += (i%100)%10
                    return i
            return node
        def IsLeaf(self,nums,node):
            dep = node/100
            pos = (node%100)/10
    
            next = (dep+1)*10 + pos*2
            next2 = (dep+1)*10 + pos*2 -1
            for i in nums:
                if i/10 == next or i/10 == next2:
                    return False
            return True
    
    
        def pathSum(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            maxDep = 0
            for i in nums:
                if maxDep < i /100:
                    maxDep = i/100
            for i in nums:
                if self.IsLeaf(nums,i) == False:
                    continue
                else:
                    self.count += (i%100)%10
                    while True:
                        i = self.getParent(nums,i)
                        if i /100 == 1:
                            break
    
    
            return self.count
  • 相关阅读:
    关于分布式系统中雷同集群技术及原理,你知道多少?
    如何在PHP中进行会话处理?
    PHP的isset()、is_null、empty()使用总结
    Mycatweb的介绍与搭建
    企业如何部署开源邮箱系统?
    企业如何选择合适的邮箱系统?
    Ansible原理与安装部署
    gRPC的简介与实例详解
    高效的性能测试工具-wrk
    轻松玩转windows之wamp开发环境部署
  • 原文地址:https://www.cnblogs.com/seyjs/p/7442729.html
Copyright © 2020-2023  润新知