Skip to content

implement SkylineProblem #311

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 16, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Data Structures/Graphs/BFS.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* @author Unknown
*
*/
public class bfs{
public class BFS{

/**
* The BFS implemented in code to use.
Expand Down
2 changes: 1 addition & 1 deletion Data Structures/Graphs/DFS.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
*
*/

public class dfs{
public class DFS{

/**
* Implementation in code of a DFS
Expand Down
2 changes: 1 addition & 1 deletion Data Structures/Graphs/PrimMST.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public static void main (String[] args)
| / \ |
(3)-------(4)
9 */
MST t = new MST();
PrimMST t = new PrimMST();
int graph[][] = new int[][] {{0, 2, 0, 6, 0},
{2, 0, 3, 8, 5},
{0, 3, 0, 0, 7},
Expand Down
2 changes: 1 addition & 1 deletion Dynamic Programming/LevenshteinDistance.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
*/

public class Levenshtein_distance{
public class LevenshteinDistance{
private static int minimum(int a, int b, int c){
if(a < b && a < c){
return a;
Expand Down
131 changes: 131 additions & 0 deletions Others/SkylineProblem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class SkylineProblem {
Building[] building;
int count;

public void run() {
Scanner sc = new Scanner(System.in);

int num = sc.nextInt();
this.building = new Building[num];

for(int i = 0; i < num; i++) {
String input = sc.next();
String[] data = input.split(",");
this.add(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2]));
}
this.print(this.findSkyline(0, num - 1));

sc.close();
}

public void add(int left, int height, int right) {
building[count++] = new Building(left, height, right);
}

public void print(ArrayList<Skyline> skyline) {
Iterator<Skyline> it = skyline.iterator();

while(it.hasNext()) {
Skyline temp = it.next();
System.out.print(temp.coordinates + "," + temp.height);
if(it.hasNext()) {
System.out.print(",");
}
}

}

public ArrayList<Skyline> findSkyline(int start, int end) {
if(start == end) {
ArrayList<Skyline> list = new ArrayList<>();
list.add(new Skyline(building[start].left, building[start].height));
list.add(new Skyline(building[end].right, 0));

return list;
}

int mid = (start + end) / 2;

ArrayList<Skyline> sky1 = this.findSkyline(start, mid);
ArrayList<Skyline> sky2 = this.findSkyline(mid + 1, end);

return this.mergeSkyline(sky1, sky2);
}

public ArrayList<Skyline> mergeSkyline(ArrayList<Skyline> sky1, ArrayList<Skyline> sky2) {
int currentH1 = 0, currentH2 = 0;
ArrayList<Skyline> skyline = new ArrayList<>();
int maxH = 0;

while(!sky1.isEmpty() && !sky2.isEmpty()) {
if(sky1.get(0).coordinates < sky2.get(0).coordinates) {
int currentX = sky1.get(0).coordinates;
currentH1 = sky1.get(0).height;

if(currentH1 < currentH2) {
sky1.remove(0);
if(maxH != currentH2) skyline.add(new Skyline(currentX, currentH2));
} else {
maxH = currentH1;
sky1.remove(0);
skyline.add(new Skyline(currentX, currentH1));
}
} else {
int currentX = sky2.get(0).coordinates;
currentH2 = sky2.get(0).height;

if(currentH2 < currentH1) {
sky2.remove(0);
if(maxH != currentH1) skyline.add(new Skyline(currentX, currentH1));
} else {
maxH = currentH2;
sky2.remove(0);
skyline.add(new Skyline(currentX, currentH2));
}
}
}

while(!sky1.isEmpty()) {
skyline.add(sky1.get(0));
sky1.remove(0);
}

while(!sky2.isEmpty()) {
skyline.add(sky2.get(0));
sky2.remove(0);
}

return skyline;
}

public class Skyline {
public int coordinates;
public int height;

public Skyline(int coordinates, int height) {
this.coordinates = coordinates;
this.height = height;
}
}

public class Building {
public int left;
public int height;
public int right;

public Building(int left, int height, int right) {
this.left = left;
this.height = height;
this.right = right;
}
}

public static void main(String[] args) {
SkylineProblem skylineProblem = new SkylineProblem();
skylineProblem.run();
}
}
131 changes: 131 additions & 0 deletions SkylineProblem/SkylineProblem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class SkylineProblem {
Building[] building;
int count;

public void run() {
Scanner sc = new Scanner(System.in);

int num = sc.nextInt();
this.building = new Building[num];

for(int i = 0; i < num; i++) {
String input = sc.next();
String[] data = input.split(",");
this.add(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2]));
}
this.print(this.findSkyline(0, num - 1));

sc.close();
}

public void add(int left, int height, int right) {
building[count++] = new Building(left, height, right);
}

public void print(ArrayList<Skyline> skyline) {
Iterator<Skyline> it = skyline.iterator();

while(it.hasNext()) {
Skyline temp = it.next();
System.out.print(temp.coordinates + "," + temp.height);
if(it.hasNext()) {
System.out.print(",");
}
}

}

public ArrayList<Skyline> findSkyline(int start, int end) {
if(start == end) {
ArrayList<Skyline> list = new ArrayList<>();
list.add(new Skyline(building[start].left, building[start].height));
list.add(new Skyline(building[end].right, 0));

return list;
}

int mid = (start + end) / 2;

ArrayList<Skyline> sky1 = this.findSkyline(start, mid);
ArrayList<Skyline> sky2 = this.findSkyline(mid + 1, end);

return this.mergeSkyline(sky1, sky2);
}

public ArrayList<Skyline> mergeSkyline(ArrayList<Skyline> sky1, ArrayList<Skyline> sky2) {
int currentH1 = 0, currentH2 = 0;
ArrayList<Skyline> skyline = new ArrayList<>();
int maxH = 0;

while(!sky1.isEmpty() && !sky2.isEmpty()) {
if(sky1.get(0).coordinates < sky2.get(0).coordinates) {
int currentX = sky1.get(0).coordinates;
currentH1 = sky1.get(0).height;

if(currentH1 < currentH2) {
sky1.remove(0);
if(maxH != currentH2) skyline.add(new Skyline(currentX, currentH2));
} else {
maxH = currentH1;
sky1.remove(0);
skyline.add(new Skyline(currentX, currentH1));
}
} else {
int currentX = sky2.get(0).coordinates;
currentH2 = sky2.get(0).height;

if(currentH2 < currentH1) {
sky2.remove(0);
if(maxH != currentH1) skyline.add(new Skyline(currentX, currentH1));
} else {
maxH = currentH2;
sky2.remove(0);
skyline.add(new Skyline(currentX, currentH2));
}
}
}

while(!sky1.isEmpty()) {
skyline.add(sky1.get(0));
sky1.remove(0);
}

while(!sky2.isEmpty()) {
skyline.add(sky2.get(0));
sky2.remove(0);
}

return skyline;
}

public class Skyline {
public int coordinates;
public int height;

public Skyline(int coordinates, int height) {
this.coordinates = coordinates;
this.height = height;
}
}

public class Building {
public int left;
public int height;
public int right;

public Building(int left, int height, int right) {
this.left = left;
this.height = height;
this.right = right;
}
}

public static void main(String[] args) {
SkylineProblem skylineProblem = new SkylineProblem();
skylineProblem.run();
}
}