Leetcode 399除數求值
阿新 • • 發佈:2021-01-12
題目定義:
給你一個變數對陣列 equations 和一個實數值陣列 values 作為已知條件, 其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。 每個 Ai 或 Bi 是一個表示單個變數的字串。 另有一些以陣列 queries 表示的問題,其中 queries[j] = [Cj, Dj] 表示第 j 個問題, 請你根據已知條件找出 Cj / Dj = ? 的結果作為答案。 返回 所有問題的答案 。如果存在某個無法確定的答案,則用 -1.0 替代這個答案。 注意:輸入總是有效的。你可以假設除法運算中不會出現除數為 0 的情況, 且不存在任何矛盾的結果。 示例 1: 輸入:equations = [["a","b"],["b","c"]], values = [2.0,3.0], queries = [["a","c"], ["b","a"],["a","e"],["a","a"],["x","x"]] 輸出:[6.00000,0.50000,-1.00000,1.00000,-1.00000] 解釋: 條件:a / b = 2.0, b / c = 3.0 問題:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? 結果:[6.0, 0.5, -1.0, 1.0, -1.0 ] 示例 2: 輸入:equations = [["a","b"],["b","c"],["bc","cd"]], values = [1.5,2.5,5.0], queries = [["a","c"],["c","b"],["bc","cd"],["cd","bc"]] 輸出:[3.75000,0.40000,5.00000,0.20000] 示例 3: 輸入:equations = [["a","b"]], values = [0.5], queries = [["a","b"],["b","a"],["a","c"],["x","y"]] 輸出:[0.50000,2.00000,-1.00000,-1.00000] 提示: 1 <= equations.length <= 20 equations[i].length == 2 1 <= Ai.length, Bi.length <= 5 values.length == equations.length 0.0 < values[i] <= 20.0 1 <= queries.length <= 20 queries[i].length == 2 1 <= Cj.length, Dj.length <= 5 Ai, Bi, Cj, Dj 由小寫英文字母與數字組成
方式一(圖):
class Solution { private Map<String,Integer> variables = new HashMap<>(); private Integer nvars = 0; public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) { List<Pair<Integer,Double>>[] edges = getEdges(equations,values); int queriesCount = queries.size(); double[] ret = new double[queriesCount]; for(int i = 0; i < queriesCount; i++){ List<String> query = queries.get(i); double result = -1.0; if(variables.containsKey(query.get(0)) && variables.containsKey(query.get(1))){ int ia = variables.get(query.get(0)); int ib = variables.get(query.get(1)); if(ia == ib) result = 1.0; else{ Queue<Integer> points = new LinkedList<>(); points.offer(ia); double[] ratios = new double[nvars]; Arrays.fill(ratios,-1.0); ratios[ia] = 1.0; while(!points.isEmpty() && ratios[ib] < 0){ int x = points.poll(); for(Pair pair : edges[x]){ int y = (int) pair.getKey(); double val = (double) pair.getValue(); if(ratios[y] < 0){ ratios[y] = ratios[x] * val; points.offer(y); } } } result = ratios[ib]; } } ret[i] = result; } return ret; } //儲存圖的節點和邊權值 private List<Pair<Integer,Double>>[] getEdges(List<List<String>> equations, double[] values){ int n = equations.size(); for(int i = 0; i < n; i++){ variables.putIfAbsent(equations.get(i).get(0),nvars++); variables.putIfAbsent(equations.get(i).get(1),nvars++); } List<Pair<Integer,Double>>[] edges = new List[nvars]; for(int i = 0 ;i < nvars; i++){ edges[i] = new ArrayList<>(); } for(int i = 0; i < n; i++){ int va = variables.get(equations.get(i).get(0)); int vb = variables.get(equations.get(i).get(1)); edges[va].add(new Pair(vb,values[i])); edges[vb].add(new Pair(va,1.0 / values[i])); } return edges; } }
方式二(Floyd演算法):
class Solution { public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) { int nvars = 0; Map<String,Integer> variables = new HashMap<>(); for(int i = 0; i < equations.size(); i++){ if(!variables.containsKey(equations.get(i).get(0))) variables.put(equations.get(i).get(0),nvars++); if(!variables.containsKey(equations.get(i).get(1))) variables.put(equations.get(i).get(1),nvars++); } double[][] graph = new double[nvars][nvars]; for(int i = 0 ; i < nvars; i++) Arrays.fill(graph[i],-1); for(int i = 0; i < equations.size(); i++){ int va = variables.get(equations.get(i).get(0)); int vb = variables.get(equations.get(i).get(1)); graph[va][vb] = values[i]; graph[vb][va] = 1.0 / values[i]; } //floyd演算法 for(int k = 0; k < nvars; k++) for(int i = 0; i < nvars; i++) for(int j = 0; j < nvars; j++) if(graph[i][k] > 0 && graph[k][j] > 0) graph[i][j] = graph[i][k] * graph[k][j]; double[] ret = new double[queries.size()]; for(int i = 0; i < queries.size(); i++){ List<String> query = queries.get(i); double result = -1.0; if(variables.containsKey(query.get(0)) && variables.containsKey(query.get(1))){ int va = variables.get(query.get(0)); int vb = variables.get(query.get(1)); if(graph[va][vb] > 0) result = graph[va][vb]; } ret[i] = result; } return ret; } }
方式三():