3613. Maximize Amount After Two Days Of Conversions¶
3613. Maximize Amount After Two Days of Conversions
Medium
You are given a string initialCurrency, and you start with 1.0 of initialCurrency.
You are also given four arrays with currency pairs (strings) and rates (real numbers):
pairs1[i] = [startCurrencyi, targetCurrencyi]denotes that you can convert fromstartCurrencyitotargetCurrencyiat a rate ofrates1[i]on day 1.pairs2[i] = [startCurrencyi, targetCurrencyi]denotes that you can convert fromstartCurrencyitotargetCurrencyiat a rate ofrates2[i]on day 2.- Also, each
targetCurrencycan be converted back to its correspondingstartCurrencyat a rate of1 / rate.
You can perform any number of conversions, including zero, using rates1 on day 1, followed by any number of additional conversions, including zero, using rates2 on day 2.
Return the maximum amount of initialCurrency you can have after performing any number of conversions on both days in order.
Note: Conversion rates are valid, and there will be no contradictions in the rates for either day. The rates for the days are independent of each other.
Example 1:
Input: initialCurrency = "EUR", pairs1 = [["EUR","USD"],["USD","JPY"]], rates1 = [2.0,3.0], pairs2 = [["JPY","USD"],["USD","CHF"],["CHF","EUR"]], rates2 = [4.0,5.0,6.0]
Output: 720.00000
Explanation:
To get the maximum amount of EUR, starting with 1.0 EUR:
- On Day 1:
- Convert EUR to USD to get 2.0 USD.
- Convert USD to JPY to get 6.0 JPY.
- On Day 2:
- Convert JPY to USD to get 24.0 USD.
- Convert USD to CHF to get 120.0 CHF.
- Finally, convert CHF to EUR to get 720.0 EUR.
Example 2:
Input: initialCurrency = "NGN", pairs1 = [["NGN","EUR"]], rates1 = [9.0], pairs2 = [["NGN","EUR"]], rates2 = [6.0]
Output: 1.50000
Explanation:
Converting NGN to EUR on day 1 and EUR to NGN using the inverse rate on day 2 gives the maximum amount.
Example 3:
Input: initialCurrency = "USD", pairs1 = [["USD","EUR"]], rates1 = [1.0], pairs2 = [["EUR","JPY"]], rates2 = [10.0]
Output: 1.00000
Explanation:
In this example, there is no need to make any conversions on either day.
Constraints:
1 <= initialCurrency.length <= 3initialCurrencyconsists only of uppercase English letters.1 <= n == pairs1.length <= 101 <= m == pairs2.length <= 10pairs1[i] == [startCurrencyi, targetCurrencyi]pairs2[i] == [startCurrencyi, targetCurrencyi]1 <= startCurrencyi.length, targetCurrencyi.length <= 3startCurrencyiandtargetCurrencyiconsist only of uppercase English letters.rates1.length == nrates2.length == m1.0 <= rates1[i], rates2[i] <= 10.0- The input is generated such that there are no contradictions or cycles in the conversion graphs for either day.
Solution¶
class Solution {
static class Pair {
String currency;
double rate;
public Pair(String currency, double rate) {
this.currency = currency;
this.rate = rate;
}
@Override
public String toString() {
return "(" + currency + " " + rate + ")";
}
}
public static double maxAmount(String initialCurrency, List<List<String>> currencyPairsDay1, double[] conversionRatesDay1, List<List<String>> currencyPairsDay2, double[] conversionRatesDay2) {
Map<String, List<Pair>> g1 = buildGraph(currencyPairsDay1, conversionRatesDay1);
Map<String, List<Pair>> g2 = buildGraph(currencyPairsDay2, conversionRatesDay2);
Map<String, Double> current_maxi = new HashMap<>();
dfs(initialCurrency, 1.0, g1, current_maxi);
double maxi = 0.0;
for (Map.Entry<String, Double> entry : current_maxi.entrySet()) {
String currency = entry.getKey();
double amount = entry.getValue();
Map<String, Double> current_maxi2 = new HashMap<>();
dfs(currency, amount, g2, current_maxi2);
maxi = Math.max(maxi, current_maxi2.getOrDefault(initialCurrency, 0.0));
}
return maxi;
}
private static Map<String, List<Pair>> buildGraph(List<List<String>> currencyPairs, double[] conversionRates) {
Map<String, List<Pair>> graph = new HashMap<>();
for (int i = 0; i < currencyPairs.size(); i++) {
String source = currencyPairs.get(i).get(0);
String target = currencyPairs.get(i).get(1);
double rate = conversionRates[i];
graph.putIfAbsent(source, new ArrayList<>());
graph.putIfAbsent(target, new ArrayList<>());
graph.get(source).add(new Pair(target, rate));
graph.get(target).add(new Pair(source, 1.0 / rate));
}
return graph;
}
private static void dfs(String currency, double amount, Map<String, List<Pair>> graph, Map<String, Double> map) {
if (amount <= map.getOrDefault(currency, 0.0)) return;
map.put(currency, amount);
for (Pair v : graph.getOrDefault(currency, new ArrayList<>())) {
dfs(v.currency, amount * v.rate, graph, map);
}
}
}
Complexity Analysis¶
- Time Complexity: O(?)
- Space Complexity: O(?)
Explanation¶
[Add detailed explanation here]