From ee036297a402ba292419327b71fdfbd6e015a807 Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Wed, 9 Jun 2021 22:17:25 +0300 Subject: [PATCH 1/8] 774-Add initial solution --- .../hard/MinimizeMaxDistanceToGasStation.java | 37 +++++++++++++++++++ ...eMaxDistanceToGasStationPriorityQueue.java | 28 ++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java create mode 100644 src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java new file mode 100644 index 00000000..aef1e827 --- /dev/null +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java @@ -0,0 +1,37 @@ +package algorithms.curated170.hard; + +import java.util.Collections; +import java.util.PriorityQueue; +import java.util.TreeMap; + +public class MinimizeMaxDistanceToGasStation { + + public double solve(int[] stats, int k) + { + double left = 0, right = stats[stats.length-1]; + while(left + 1e-6 < right) + { + double mid = (left+right)/2; + int count = 0; + for(int i = 0; i k) + { + left = mid; + } + else + { + right = mid; + } + } + return right; + } + + public static void main(String[] args) { + var solution = new MinimizeMaxDistanceToGasStation(); + + System.out.println(solution.solve(new int[]{1,2,3,4,5},4)); + } +} diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java new file mode 100644 index 00000000..11766bc8 --- /dev/null +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -0,0 +1,28 @@ +package algorithms.curated170.hard; + +import java.util.PriorityQueue; + +public class MinimizeMaxDistanceToGasStationPriorityQueue { + + public double solve(int[] stats, int k) { + PriorityQueue pq = new PriorityQueue<>((a,b)->Double.compare(b[0], a[0])); + + for (int i = 0; i < stats.length - 1; i++) { + pq.offer(new double[] { stats[i + 1] - stats[i], 1 }); + } + for(int i = 0; i Date: Thu, 10 Jun 2021 20:19:12 +0300 Subject: [PATCH 2/8] 774-Fix style --- .../hard/MinimizeMaxDistanceToGasStation.java | 27 +++++++++---------- ...eMaxDistanceToGasStationPriorityQueue.java | 12 +++++---- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java index aef1e827..44a7dfa2 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java @@ -6,23 +6,20 @@ public class MinimizeMaxDistanceToGasStation { - public double solve(int[] stats, int k) - { - double left = 0, right = stats[stats.length-1]; - while(left + 1e-6 < right) - { - double mid = (left+right)/2; + public double solve(int[] stats, int k) { + double left = 0, right = stats[stats.length - 1]; + + while (left + 1e-6 < right) { + double mid = (left + right) / 2; int count = 0; - for(int i = 0; i k) - { + + if (count > k) { left = mid; - } - else - { + } else { right = mid; } } @@ -32,6 +29,6 @@ public double solve(int[] stats, int k) public static void main(String[] args) { var solution = new MinimizeMaxDistanceToGasStation(); - System.out.println(solution.solve(new int[]{1,2,3,4,5},4)); + System.out.println(solution.solve(new int[] { 1, 2, 3, 4, 5 }, 4)); } } diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java index 11766bc8..95d5af3f 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -5,18 +5,20 @@ public class MinimizeMaxDistanceToGasStationPriorityQueue { public double solve(int[] stats, int k) { - PriorityQueue pq = new PriorityQueue<>((a,b)->Double.compare(b[0], a[0])); + PriorityQueue pq = new PriorityQueue<>((a, b) -> Double.compare(b[0], a[0])); for (int i = 0; i < stats.length - 1; i++) { pq.offer(new double[] { stats[i + 1] - stats[i], 1 }); } - for(int i = 0; i Date: Fri, 11 Jun 2021 17:07:37 +0300 Subject: [PATCH 3/8] 774-Fix method names --- .../curated170/hard/MinimizeMaxDistanceToGasStation.java | 2 +- .../hard/MinimizeMaxDistanceToGasStationPriorityQueue.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java index 44a7dfa2..250b84c0 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java @@ -6,7 +6,7 @@ public class MinimizeMaxDistanceToGasStation { - public double solve(int[] stats, int k) { + public double minmaxGasDist(int[] stats, int k) { double left = 0, right = stats[stats.length - 1]; while (left + 1e-6 < right) { diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java index 95d5af3f..31e5bb11 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -4,7 +4,7 @@ public class MinimizeMaxDistanceToGasStationPriorityQueue { - public double solve(int[] stats, int k) { + public double minmaxGasDist(int[] stats, int k) { PriorityQueue pq = new PriorityQueue<>((a, b) -> Double.compare(b[0], a[0])); for (int i = 0; i < stats.length - 1; i++) { From 4dc8e63c381fdecc2e09442705bea298cc34913d Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Fri, 11 Jun 2021 17:16:15 +0300 Subject: [PATCH 4/8] 774-Improve Binary Search --- .../curated170/hard/MinimizeMaxDistanceToGasStation.java | 4 ++-- .../hard/MinimizeMaxDistanceToGasStationPriorityQueue.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java index 250b84c0..5e00b301 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java @@ -7,7 +7,7 @@ public class MinimizeMaxDistanceToGasStation { public double minmaxGasDist(int[] stats, int k) { - double left = 0, right = stats[stats.length - 1]; + double left = 0, right = stats[stats.length - 1] - stats[0]; while (left + 1e-6 < right) { double mid = (left + right) / 2; @@ -29,6 +29,6 @@ public double minmaxGasDist(int[] stats, int k) { public static void main(String[] args) { var solution = new MinimizeMaxDistanceToGasStation(); - System.out.println(solution.solve(new int[] { 1, 2, 3, 4, 5 }, 4)); + System.out.println(solution.minmaxGasDist(new int[] { 1, 2, 3, 4, 5 }, 4)); } } diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java index 31e5bb11..41ee7943 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -25,6 +25,6 @@ public double minmaxGasDist(int[] stats, int k) { public static void main(String[] args) { var solution = new MinimizeMaxDistanceToGasStationPriorityQueue(); - System.out.println(solution.solve(new int[] { 1, 2, 3, 4, 5 }, 4)); + System.out.println(solution.minmaxGasDist(new int[] { 1, 2, 3, 4, 5 }, 4)); } } From 94da2139da3fe89cfde760df232253528afee875 Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Sat, 12 Jun 2021 10:27:52 +0300 Subject: [PATCH 5/8] 774-Improve Priority Queue Solution --- ...eMaxDistanceToGasStationPriorityQueue.java | 77 ++++++++++++++++--- 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java index 41ee7943..05907eb7 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -1,25 +1,82 @@ package algorithms.curated170.hard; +import java.util.Comparator; import java.util.PriorityQueue; public class MinimizeMaxDistanceToGasStationPriorityQueue { + + PriorityQueue pq; - public double minmaxGasDist(int[] stats, int k) { - PriorityQueue pq = new PriorityQueue<>((a, b) -> Double.compare(b[0], a[0])); + public double minmaxGasDist(int[] stations, int K) { - for (int i = 0; i < stats.length - 1; i++) { - pq.offer(new double[] { stats[i + 1] - stats[i], 1 }); - } + pq = new PriorityQueue(new Comparator() { + public int compare(Interval a, Interval b) { + + double diff = a.distance() - b.distance(); + if (diff < 0) { + return +1; + } else if (diff > 0) { + return -1; + } else { + return 0; + } + } + }); + + double leftToRight = stations[stations.length - 1] - stations[0]; - for (int i = 0; i < k; i++) { - double[] pair = pq.poll(); + int remaining = distributeStations(stations, K, leftToRight); + shareTheRest(remaining); + + Interval last = pq.poll(); + return last.distance(); + + } + + private void shareTheRest(int remaining) { + while (remaining > 0) { + Interval interval = pq.poll(); + Interval nextLargest = pq.peek(); + while(remaining > 0 && interval.distance() > nextLargest.distance()) + { + interval.numInsertions++; + remaining--; + } + pq.add(interval); + } + } + + private int distributeStations(int[] stations, int K, double leftToRight) { + int remaining = K; + for (int i = 0; i < stations.length - 1; i++) { + int numInsertions = (int) (K * calculateProportion(stations, i, leftToRight)); + + pq.add(new Interval(stations[i], stations[i + 1], numInsertions)); + + remaining -= numInsertions; + } + return remaining; + } + + private double calculateProportion(int[] stations, int i, double leftToRight) + { + return (double) (stations[i + 1] - stations[i]) / leftToRight; + } - pair[0] = pair[0] * pair[1] / (++pair[1]); + class Interval { + double left; + double right; + int numInsertions; - pq.offer(pair); + double distance() { + return (right - left) / ((double) (numInsertions + 1)); } - return pq.poll()[0]; + Interval(double left, double right, int numInsertions) { + this.left = left; + this.right = right; + this.numInsertions = numInsertions; + } } public static void main(String[] args) { From fcddf23bf99f4e7df894ccd07c8c4c524db43a9a Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Sat, 12 Jun 2021 16:03:45 +0300 Subject: [PATCH 6/8] 774-Updata PQ solution --- .../MinimizeMaxDistanceToGasStationPriorityQueue.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java index 05907eb7..eb4201fd 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -36,13 +36,9 @@ public int compare(Interval a, Interval b) { private void shareTheRest(int remaining) { while (remaining > 0) { Interval interval = pq.poll(); - Interval nextLargest = pq.peek(); - while(remaining > 0 && interval.distance() > nextLargest.distance()) - { - interval.numInsertions++; - remaining--; - } + interval.numInsertions++; pq.add(interval); + remaining--; } } From 9e62c4d18e7c711c11629661d12f0eced8e6aa46 Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Sat, 12 Jun 2021 17:43:06 +0300 Subject: [PATCH 7/8] 774-Update PQ Solution 2 --- ...eMaxDistanceToGasStationPriorityQueue.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java index eb4201fd..1c7c796e 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueue.java @@ -7,7 +7,7 @@ public class MinimizeMaxDistanceToGasStationPriorityQueue { PriorityQueue pq; - public double minmaxGasDist(int[] stations, int K) { + public double minmaxGasDist(final int[] stats, final int K) { pq = new PriorityQueue(new Comparator() { public int compare(Interval a, Interval b) { @@ -23,9 +23,10 @@ public int compare(Interval a, Interval b) { } }); - double leftToRight = stations[stations.length - 1] - stations[0]; - int remaining = distributeStations(stations, K, leftToRight); + + int remaining = distributeStations(stats, K); + shareTheRest(remaining); Interval last = pq.poll(); @@ -42,35 +43,30 @@ private void shareTheRest(int remaining) { } } - private int distributeStations(int[] stations, int K, double leftToRight) { + private int distributeStations(final int[] stats, final int K) { int remaining = K; - for (int i = 0; i < stations.length - 1; i++) { - int numInsertions = (int) (K * calculateProportion(stations, i, leftToRight)); + final double intervalPlacementSubrange = K / (stats[stats.length - 1] - stats[0]); + + for (int i = 0; i < stats.length - 1; i++) { + int numInsertions = (int) ((stats[i + 1] - stats[i])*intervalPlacementSubrange); - pq.add(new Interval(stations[i], stations[i + 1], numInsertions)); + pq.add(new Interval(stats[i], stats[i + 1], numInsertions)); remaining -= numInsertions; } return remaining; } - private double calculateProportion(int[] stations, int i, double leftToRight) - { - return (double) (stations[i + 1] - stations[i]) / leftToRight; - } - class Interval { - double left; - double right; + final double length; int numInsertions; double distance() { - return (right - left) / ((double) (numInsertions + 1)); + return length / (numInsertions + 1); } Interval(double left, double right, int numInsertions) { - this.left = left; - this.right = right; + length = right - left; this.numInsertions = numInsertions; } } @@ -79,5 +75,6 @@ public static void main(String[] args) { var solution = new MinimizeMaxDistanceToGasStationPriorityQueue(); System.out.println(solution.minmaxGasDist(new int[] { 1, 2, 3, 4, 5 }, 4)); + System.out.println(solution.minmaxGasDist(new int[] { 0, 100, 150}, 4)); } } From 5f2c202f024d2af3cd7d692a7e7fb7379e9414ef Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Sat, 12 Jun 2021 17:48:31 +0300 Subject: [PATCH 8/8] 774-Add Discrete PQ solution --- .../hard/MinimizeMaxDistanceToGasStation.java | 4 --- ...anceToGasStationPriorityQueueDiscrete.java | 34 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueueDiscrete.java diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java index 5e00b301..cfff0cb4 100644 --- a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStation.java @@ -1,9 +1,5 @@ package algorithms.curated170.hard; -import java.util.Collections; -import java.util.PriorityQueue; -import java.util.TreeMap; - public class MinimizeMaxDistanceToGasStation { public double minmaxGasDist(int[] stats, int k) { diff --git a/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueueDiscrete.java b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueueDiscrete.java new file mode 100644 index 00000000..3cf4fca9 --- /dev/null +++ b/src/main/java/algorithms/curated170/hard/MinimizeMaxDistanceToGasStationPriorityQueueDiscrete.java @@ -0,0 +1,34 @@ +package algorithms.curated170.hard; + +import java.util.PriorityQueue; + +public class MinimizeMaxDistanceToGasStationPriorityQueueDiscrete { + + public double minmaxGasDist(int[] stats, int k) { + PriorityQueue pq = new PriorityQueue<>((a, b) -> Double.compare(b[0], a[0])); + + for (int i = 0; i < stats.length - 1; i++) { + pq.offer(new double[] { stats[i + 1] - stats[i], 1 }); + } + double maxDistance = (stats[stats.length-1] - stats[0])/(double)(k+1); + while (k>0) { + double[] pair = pq.poll(); + double nextLargest = pq.peek()[0]; + while(k>0 && (pair[0]>=nextLargest || pair[0]>maxDistance)){ + pair[0] = pair[0] * pair[1] / (++pair[1]); + k--; + } + + pq.offer(pair); + + } + + return pq.poll()[0]; + } + + public static void main(String[] args) { + var solution = new MinimizeMaxDistanceToGasStationPriorityQueueDiscrete(); + + System.out.println(solution.minmaxGasDist(new int[] { 1, 2, 3, 4, 5 }, 4)); + } +}