Solve HackerRank Minimum Loss 1
Solve HackerRank Minimum Loss 1 in Java
This should be a simple problem, but finding a correct solution online seems challenging. So I’d like to solve it using O(n²) and the optimized O(nlogn) solution.
Problem
Lauren has a chart of distinct projected prices for a house over the next several years. She must buy the house in one year and sell it in another, and she must do so at a loss. She wants to minimize her financial loss.
Example
price = [20, 15, 8, 2, 12]
Her minimum loss is incurred by purchasing in year 2 at 15 and reselling in year 5 at 12. Return 3.
Function Description
Complete the minimumLoss function in the editor below.
minimumLoss has the following parameter(s):
- int price[n]: home prices at each year
Returns
- int: the minimum loss possible
HackerRank original problem below:
Solution
The common mistake is to sort the price array and then find the minimum. We need to keep the original order to find the minimal value.
Solution 1: Keep it simple and use O(n²)
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
class Result {
/*
* Complete the 'minimumLoss' function below.
*
* The function is expected to return an INTEGER.
* The function accepts LONG_INTEGER_ARRAY price as parameter.
*/
public static long minimumLoss(List<Long> price) {
// Write your code here
long min = Long.MAX_VALUE;
for (int i = 0; i < price.size(); i++) {
for (int j = i + 1; j < price.size(); j++) {
if (price.get(i) >= price.get(j) && price.get(i) - price.get(j) < min)
min = price.get(i) - price.get(j);
}
}
return min;
}
}
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
int n = Integer.parseInt(bufferedReader.readLine().trim());
List<Long> price = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
.map(Long::parseLong)
.collect(toList());
long result = Result.minimumLoss(price);
bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();
bufferedReader.close();
bufferedWriter.close();
}
}
Solution 2: Optimize it for O(nlogn)
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
class Result {
/*
* Complete the 'minimumLoss' function below.
*
* The function is expected to return an INTEGER.
* The function accepts LONG_INTEGER_ARRAY price as parameter.
*/
public static long minimumLoss(List<Long> price) {
TreeSet<Long> priceSet = new TreeSet<>();
long min = Long.MAX_VALUE;
for (int i = 0; i < price.size(); i++) {
Long higher = priceSet.higher(price.get(i));
if (higher != null) {
min = Math.min(higher - price.get(i), min);
}
priceSet.add(price.get(i));
}
return min;
}
}
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
int n = Integer.parseInt(bufferedReader.readLine().trim());
List<Long> price = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
.map(Long::parseLong)
.collect(toList());
long result = Result.minimumLoss(price);
bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();
bufferedReader.close();
bufferedWriter.close();
}
}
It can 100% pass all test cases.
Happy coding!
Questions, ideas? Leave comments here. Follow me to be part of the fun problem-solving journey.