diff --git a/README.md b/README.md index 1115d2b..bdfeb29 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,25 @@ My LeetCode solutions in Java, focused on clean code and optimal algorithms. ## Solutions -| # | Problem | Difficulty | Time | Space | -|------|-----------------------------------------------------------------------------------------------------------------------|------------|-------------------|--------| -| 1 | [Two Sum](https://leetcode.com/problems/two-sum/) | Easy | `O(n log n)` | `O(n)` | -| 9 | [Palindrome Number](https://leetcode.com/problems/palindrome-number/) | Easy | `O(log10(n) / 2)` | `O(1)` | -| 70 | [Climbing Stairs](https://leetcode.com/problems/climbing-stairs/) | Easy | `O(n)` | `O(1)` | -| 1653 | [Minimum Deletions to Make String Balanced](https://leetcode.com/problems/minimum-deletions-to-make-string-balanced/) | Medium | `O(n)` | `O(1)` | +| #* | Problem | Difficulty | Time | Space | +|-----------------|----------------------------------------------------------------------------------------------------------------------------------|------------|-------------------|--------| +| [1][lc-1] | [Two Sum](src/main/java/codes/yam/leetcode/twosum/Solution.java) | Easy | `O(n log n)` | `O(n)` | +| [9][lc-9] | [Palindrome Number](src/main/java/codes/yam/leetcode/palindromenumber/Solution.java) | Easy | `O(log10(n) / 2)` | `O(1)` | +| [70][lc-70] | [Climbing Stairs](src/main/java/codes/yam/leetcode/climbingstairs/Solution.java) | Easy | `O(n)` | `O(1)` | +| [746][lc-746] | [Min Cost Climbing Stairs](src/main/java/codes/yam/leetcode/mincostclimbingstairs/Solution.java) | Easy | `O(n)` | `O(1)` | +| [1653][lc-1653] | [Minimum Deletions to Make String Balanced](src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/Solution.java) | Medium | `O(n)` | `O(1)` | + +*Problem numbers link to LeetCode; problem names link to solution source. + +[lc-1]: https://leetcode.com/problems/two-sum/ + +[lc-9]: https://leetcode.com/problems/palindrome-number/ + +[lc-70]: https://leetcode.com/problems/climbing-stairs/ + +[lc-746]: https://leetcode.com/problems/min-cost-climbing-stairs/ + +[lc-1653]: https://leetcode.com/problems/minimum-deletions-to-make-string-balanced/ ## Project Structure diff --git a/src/main/java/codes/yam/leetcode/mincostclimbingstairs/Solution.java b/src/main/java/codes/yam/leetcode/mincostclimbingstairs/Solution.java new file mode 100644 index 0000000..b5fa31a --- /dev/null +++ b/src/main/java/codes/yam/leetcode/mincostclimbingstairs/Solution.java @@ -0,0 +1,24 @@ +package codes.yam.leetcode.mincostclimbingstairs; + +/** + * Solution for the Min Cost Climbing Stairs problem. + * + *

Optimizes {@code SolutionDp} by replacing the DP array with two rolling variables. + * + *

+ */ +class Solution { + int minCostClimbingStairs(int[] cost) { + int a = 0; + int b = 0; + for (int i = 2; i <= cost.length; i++) { + int c = Math.min(a + cost[i - 2], b + cost[i - 1]); + a = b; + b = c; + } + return b; + } +} diff --git a/src/main/java/codes/yam/leetcode/mincostclimbingstairs/SolutionDp.java b/src/main/java/codes/yam/leetcode/mincostclimbingstairs/SolutionDp.java new file mode 100644 index 0000000..3c9dd1c --- /dev/null +++ b/src/main/java/codes/yam/leetcode/mincostclimbingstairs/SolutionDp.java @@ -0,0 +1,22 @@ +package codes.yam.leetcode.mincostclimbingstairs; + +/** + * Solution for the Min Cost Climbing Stairs problem. + * + * + */ +class SolutionDp { + int minCostClimbingStairs(int[] cost) { + int n = cost.length; + int[] dp = new int[n + 1]; + dp[0] = 0; + dp[1] = 0; + for (int i = 2; i <= n; i++) { + dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]); + } + return dp[n]; + } +} diff --git a/src/main/java/codes/yam/leetcode/mincostclimbingstairs/package-info.java b/src/main/java/codes/yam/leetcode/mincostclimbingstairs/package-info.java new file mode 100644 index 0000000..02a26e9 --- /dev/null +++ b/src/main/java/codes/yam/leetcode/mincostclimbingstairs/package-info.java @@ -0,0 +1,18 @@ +/** + * Solutions for the "Min Cost Climbing Stairs" problem on LeetCode. + * + * + * + *

Solution progression: + * + *

    + *
  1. {@code SolutionDp} — Bottom-up DP, O(n) time, O(n) space + *
  2. {@code Solution} — Space-optimized DP, O(n) time, O(1) space + *
+ * + * @see Problem Link + */ +package codes.yam.leetcode.mincostclimbingstairs; diff --git a/src/test/java/codes/yam/leetcode/mincostclimbingstairs/SolutionDpTest.java b/src/test/java/codes/yam/leetcode/mincostclimbingstairs/SolutionDpTest.java new file mode 100644 index 0000000..c274400 --- /dev/null +++ b/src/test/java/codes/yam/leetcode/mincostclimbingstairs/SolutionDpTest.java @@ -0,0 +1,14 @@ +package codes.yam.leetcode.mincostclimbingstairs; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class SolutionDpTest { + @ParameterizedTest + @MethodSource("codes.yam.leetcode.mincostclimbingstairs.TestCases#cases") + void minCostClimbingStairs(int[] cost, int expected) { + assertEquals(expected, new SolutionDp().minCostClimbingStairs(cost)); + } +} diff --git a/src/test/java/codes/yam/leetcode/mincostclimbingstairs/SolutionTest.java b/src/test/java/codes/yam/leetcode/mincostclimbingstairs/SolutionTest.java new file mode 100644 index 0000000..c6c6745 --- /dev/null +++ b/src/test/java/codes/yam/leetcode/mincostclimbingstairs/SolutionTest.java @@ -0,0 +1,14 @@ +package codes.yam.leetcode.mincostclimbingstairs; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class SolutionTest { + @ParameterizedTest + @MethodSource("codes.yam.leetcode.mincostclimbingstairs.TestCases#cases") + void minCostClimbingStairs(int[] cost, int expected) { + assertEquals(expected, new Solution().minCostClimbingStairs(cost)); + } +} diff --git a/src/test/java/codes/yam/leetcode/mincostclimbingstairs/TestCases.java b/src/test/java/codes/yam/leetcode/mincostclimbingstairs/TestCases.java new file mode 100644 index 0000000..437b08f --- /dev/null +++ b/src/test/java/codes/yam/leetcode/mincostclimbingstairs/TestCases.java @@ -0,0 +1,13 @@ +package codes.yam.leetcode.mincostclimbingstairs; + +import java.util.stream.Stream; +import org.junit.jupiter.params.provider.Arguments; + +@SuppressWarnings("unused") +class TestCases { + static Stream cases() { + return Stream.of( + Arguments.of(new int[] {10, 15, 20}, 15), + Arguments.of(new int[] {1, 100, 1, 1, 1, 100, 1, 1, 100, 1}, 6)); + } +}