zoukankan      html  css  js  c++  java
  • leetcode399

     1 class Solution:
     2     def calcEquation(self, equations: 'List[List[str]]', values: 'List[float]', queries: 'List[List[str]]') -> 'List[float]':
     3         sets = set()
     4         for eq in equations:
     5             sets.add(eq[0])
     6             sets.add(eq[1])
     7         l = sorted(list(sets))
     8         n = len(l)
     9         l1 = [[x] for x in l]
    10         l2 = [[1.0]] * n
    11 
    12         nx = len(equations)
    13         for i in range(nx):
    14             p1 = equations[i][0]
    15             p2 = equations[i][1]
    16             pp = values[i]
    17             if pp <= 1.0:
    18                 p1,p2 = p2,p1
    19                 pp = 1/pp
    20                 print(p1,p2,pp)
    21 
    22             i1 = 0
    23             i2 = 0
    24             i22 = 0
    25             ct = 0
    26             for j in range(len(l1)):    
    27                 if p1 in l1[j]:
    28                     i1 = j
    29                     i11 = l1[j].index(p1)
    30                     ct += 1
    31                 if p2 in l1[j]:
    32                     i2 = j
    33                     i22 = l1[j].index(p2)
    34                     ct += 1
    35                 if ct==2:
    36                     break
    37             l2[i1] =  [y * pp * l2[i2][i22] / l2[i1][i11] for y in l2[i1]]
    38             l2[i1] = l2[i1] + l2[i2]
    39             l2.pop(i2)
    40             l1[i1] = l1[i1] + l1[i2]
    41             l1.pop(i2)
    42 
    43         result = list()
    44         for i in range(len(queries)):
    45             q1 = queries[i][0]
    46             q2 = queries[i][1]
    47             if q1 not in l or q2 not in l:
    48                 result.append(-1.0)
    49             else:
    50                 qi1 = 0
    51                 qi2 = 0
    52                 ct2 = 0
    53                 for j in range(len(l1)):
    54                     if q1 in l1[j]:
    55                         qi1 = j
    56                         ct2 += 1
    57                     if q2 in l1[j]:
    58                         qi2 = j
    59                         ct2 += 1
    60                     if ct2 == 2:
    61                         break
    62                 if qi1 != qi2:
    63                     result.append(-1.0)
    64                 else:
    65                     k1 = l1[qi1].index(q1)
    66                     k2 = l1[qi1].index(q2)
    67                     v1 = l2[qi2][k1]
    68                     v2 = l2[qi2][k2]
    69                     result.append(v1/v2)
    70 
    71         return result

    纯集合运算,并查集的思想。

    将有运算关系的项目放在同一个集合中,并统一这个集合中的各项的倍数关系。

    例如:a / b = 2.0, b / c = 3.0

    则a,b,c三个项相互之间具有运算关系,通过程序形成两个集合

    集合l1记录项的位置[a,b,c],集合l2记录项的比例[6.0,3.0,1.0],表示a:b:c=6.0:3.0:1.0。

    有了这样的数据结构,就可以进行运算。比如计算a/c,就取a的比例值6.0处以c的比例值1.0,结果等于6.0。

  • 相关阅读:
    对软件工程课程的期望
    软件工程进阶
    结对-爬取大麦网近期演唱会信息-需求分析
    对软件工程课程的期望
    自我介绍
    软件工程进阶
    阅读任务-阅读提问-1
    《对软件工程课程的期望》
    《自我介绍》
    第0周课后作业
  • 原文地址:https://www.cnblogs.com/asenyang/p/10840309.html
Copyright © 2011-2022 走看看