Skip to content

Commit 8c6a018

Browse files
author
Ayan Sen
committed
added code for minimum perfect squares
1 parent 9ad6838 commit 8c6a018

File tree

12 files changed

+99
-55
lines changed

12 files changed

+99
-55
lines changed

src/main/java/datastructure/lists/problems/LargestAndSmallestNumber.java renamed to src/main/java/algorithms/divideandconquer/LargestAndSmallestNumber.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package datastructure.lists.problems;
1+
package algorithms.divideandconquer;
22

33
/**
44
* Created by aysen on 10/16/16.

src/main/java/algorithms/dp/LongestCommonSubsequence.java

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ public int recursiveLCS(char[] firstString, char[] secondString, int positionOfF
2323
return 0;
2424
}
2525
if (firstString[positionOfFirstString] == secondString[positionOfSecondString]) {
26-
return recursiveLCS(firstString, secondString, positionOfFirstString - 1, positionOfSecondString - 1, memo) + 1;
26+
memo[positionOfFirstString][positionOfSecondString] = recursiveLCS(firstString, secondString, positionOfFirstString - 1, positionOfSecondString - 1, memo) + 1;
2727
} else {
28-
return Math.max(recursiveLCS(firstString, secondString, positionOfFirstString, positionOfSecondString - 1, memo), recursiveLCS(firstString, secondString, positionOfFirstString - 1, positionOfSecondString, memo));
28+
memo[positionOfFirstString][positionOfSecondString] = Math.max(recursiveLCS(firstString, secondString, positionOfFirstString, positionOfSecondString - 1, memo), recursiveLCS(firstString, secondString, positionOfFirstString - 1, positionOfSecondString, memo));
2929
}
30+
return memo[positionOfFirstString][positionOfSecondString];
3031

3132
}
3233

@@ -35,31 +36,10 @@ public int longestCommonSubsequence(String firstString, String secondString) {
3536

3637
Integer[][] memo = new Integer[firstString.length()][secondString.length()];
3738

38-
return recursiveLCS(firstString.toCharArray(), secondString.toCharArray(), firstString.length() - 1, secondString.length() - 1,memo);
39+
return recursiveLCS(firstString.toCharArray(), secondString.toCharArray(), firstString.length() - 1, secondString.length() - 1, memo);
3940
/*
4041
*/
4142
}
4243

43-
private int lcsIterative(char[] firstString, char[] secondString) {
44-
45-
//min(f(x-1,y),f(x,y-1)) + 1 if(firstString[i] == secondString[j])
46-
47-
Integer[][] memo = new Integer[firstString.length][secondString.length];
48-
for (int i = 0; i < firstString.length; i++) {
49-
50-
for (int j = 0; j < secondString.length; j++) {
51-
if (i == 0 || j == 0) {
52-
memo[i][j] = 0;
53-
} else if (firstString[i] == secondString[j]) {
54-
memo[i][j] = memo[i - 1][j - 1] + 1;
55-
} else {
56-
memo[i][j] = Math.max(memo[i][j - 1], memo[i - 1][j]);
57-
}
58-
}
59-
}
60-
return memo[firstString.length - 1][secondString.length - 1];
61-
62-
}
63-
6444

6545
}

src/main/java/algorithms/dp/LowestTravelCost.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
import java.util.*;
44
import java.util.stream.Collectors;
5-
import java.util.stream.IntStream;
65

76

87
public class LowestTravelCost {
98

10-
private int findLowestCostRecursive(int[] daysOfTravel, int currentValidity, int currentIndex, Map<Integer, Integer> costValidityMap, Map<Integer, Integer> memo) {
9+
private int findLowestCostRecursive(int[] daysOfTravel, int currentValidity, int currentIndex, Map<Integer, Integer> costValidityMap, Integer[] memo) {
1110

1211
if (currentValidity >= 30 || currentIndex == daysOfTravel.length) {
1312
return 0;
@@ -20,8 +19,8 @@ private int findLowestCostRecursive(int[] daysOfTravel, int currentValidity, int
2019
minimumCost = Collections.min(costValidityMap.entrySet().stream().map(tuple -> findLowestCostRecursive(daysOfTravel, currentValidity, currentIndex + 1, costValidityMap, memo)).collect(Collectors.toList()));
2120

2221
} else {
23-
if (memo.containsKey(dayOfMonth)) {
24-
return memo.get(dayOfMonth);
22+
if (memo[dayOfMonth] != null) {
23+
return memo[dayOfMonth];
2524
}
2625
List<Integer> minimumCosts = new ArrayList<>();
2726
costValidityMap.entrySet().forEach(tuple -> {
@@ -30,15 +29,15 @@ private int findLowestCostRecursive(int[] daysOfTravel, int currentValidity, int
3029
minimumCost = Collections.min(minimumCosts);
3130
}
3231

33-
memo.put(dayOfMonth, minimumCost);
32+
memo[dayOfMonth] = minimumCost;
3433
return minimumCost;
3534
}
3635

3736

3837
public int findLowestTravelCost(int[] daysOfTravel) {
3938
Map<Integer, Integer> costValidityMap = new HashMap<>();
4039
costValidityMap.entrySet();
41-
Map<Integer, Integer> memo = new HashMap<>();
40+
Integer[] memo = new Integer[31];
4241
costValidityMap.put(2, 1);
4342
costValidityMap.put(7, 7);
4443
costValidityMap.put(25, 30);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package algorithms.dp;
2+
3+
public class MinimumPerfectSquares {
4+
/**
5+
* Given a number, find the minimum number of perfect squares adding upto that number
6+
*
7+
* @param n
8+
* @return
9+
*/
10+
public int findMinimumPerfectSquaresAddingToSum(final int n) {
11+
Integer[] memo = new Integer[n + 1];
12+
13+
return findMinimumPerfectSquaresAddingToSumRecursively(n, memo);
14+
}
15+
16+
private int findMinimumPerfectSquaresAddingToSumRecursively(final int n, Integer[] memo) {
17+
if (n == 0) {
18+
return 0;
19+
} else if (memo[n] != null) {
20+
return memo[n];
21+
} else {
22+
int absoluteMin = n;
23+
for (int i = 1; (i * i) <= n; i++) {
24+
int currentMin = 1 + findMinimumPerfectSquaresAddingToSumRecursively(n - (i * i), memo);
25+
if (currentMin < absoluteMin) {
26+
absoluteMin = currentMin;
27+
}
28+
}
29+
memo[n] = absoluteMin;
30+
return absoluteMin;
31+
}
32+
}
33+
}

src/main/java/algorithms/dp/ShortestPath.java

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/main/java/datastructure/heap/BinaryMaxHeap.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6-
/**
7-
* Created by aysen on 10/25/16.
8-
*/
96
public class BinaryMaxHeap<T extends Comparable> implements Heap<T> {
107

118
List<T> heap;

src/main/java/datastructure/heap/BinaryMinHeap.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6-
/**
7-
* Created by aysen on 10/25/16.
8-
*/
96
public class BinaryMinHeap<T extends Comparable> implements Heap<T> {
107

118
List<T> heap;

src/main/java/datastructure/heap/problems/HeapProblems.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77
import java.util.List;
88
import java.util.stream.Collectors;
99

10-
/**
11-
* Created by aysen on 10/26/16.
12-
*/
1310
public class HeapProblems {
1411

1512
public static List<Integer> sortListUsingHeap(List<Integer> numbers) {

src/main/java/datastructure/lists/problems/ListProblems.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,30 @@ public static Integer maximumProductOfSubarray(Integer[] array) {
5757
}
5858
}
5959

60+
/**
61+
* Given an array of positive and negative numbers find the maximum sum of sub array
62+
*
63+
* @param array input array
64+
* @return maximum sum
65+
*/
66+
public static Integer findMaxSumOfSubArray(Integer[] array) {
67+
{
68+
int maxSum = 0;
69+
int runningMax = 0;
70+
for (int i = 0; i < array.length; i++) {
71+
Integer currentNumber = array[i];
72+
if (currentNumber > 0) {
73+
runningMax = runningMax + currentNumber;
74+
maxSum = Math.max(runningMax, maxSum);
75+
}
76+
if (currentNumber < 0) {
77+
runningMax = Math.max(0, runningMax + currentNumber);
78+
79+
}
80+
}
81+
return maxSum;
82+
}
83+
}
84+
6085

6186
}

src/test/java/algorithm/dp/LCSTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package algorithm.dp;
22

33
import algorithms.dp.LongestCommonSubsequence;
4+
import org.junit.Assert;
45
import org.junit.Test;
56

67
/**
@@ -11,6 +12,6 @@ public class LCSTest {
1112
@Test
1213
public void testLcs() {
1314
LongestCommonSubsequence lcs = new LongestCommonSubsequence();
14-
System.out.println(lcs.longestCommonSubsequence("thanksa", "halkoa"));
15+
Assert.assertEquals(lcs.longestCommonSubsequence("thanksa", "halkoa"), 3);
1516
}
1617
}

0 commit comments

Comments
 (0)