Raindrop on Sidewalk
Description
Solution
TreeSet Approach
public class RaindropSidewalk {
private TreeSet<double[]> sidewalk = new TreeSet<>(new Comparator<double[]>() {
@Override
public int compare(double[] a, double[] b) {
return Double.compare(a[0], b[0]);
}
});
public void addRainDrop(double center) {
double[] range = new double[] {center - 0.5, center + 0.5};
double[] left = sidewalk.floor(range);
if (left != null && left[1] > range[0]) {
range[0] = left[0];
sidewalk.remove(left);
}
double[] right = sidewalk.ceiling(range);
if (right != null && right[0] < range[1]) {
range[1] = right[1];
sidewalk.remove(right);
}
sidewalk.add(range);
}
public boolean isCovered() {
if (sidewalk.size() == 1) {
if (sidewalk.first()[0] <= 0 && sidewalk.first()[1] >= 100) {
return true;
}
}
return false;
}
public void printSideWalk() {
System.out.println("--" + sidewalk.size());
for (double[] rain: sidewalk) {
System.out.println("::" + Arrays.toString(rain));
}
}
public void print() {
System.out.println("size ::" + sidewalk.size());
}
public static void main(String[] args) {
Random rand = new Random();
RaindropSidewalk s = new RaindropSidewalk();
int count = 0;
for (int rain = 0; rain <= 100; rain++) {
s.addRainDrop(rain);
s.printSideWalk();
}
/*
while (!s.isCovered()) {
double rain = (double)rand.nextInt(101) + rand.nextDouble();
s.addRainDrop(rain);
count++;
if (count % 1e5 == 0) {
s.print();
}
if (count % 1e7 == 0) {
s.printSideWalk();
}
if (count > 1e9) {
break;
}
}
System.out.println("count: " + count);
*/
}
}Interval Approach
Another Interval approach
Reference
Last updated