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.
+ *
+ *
+ * - Time Complexity:
O(n)
+ * - Space Complexity:
O(1)
+ *
+ */
+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.
+ *
+ *
+ * - Time Complexity:
O(n)
+ * - Space Complexity:
O(n)
+ *
+ */
+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.
+ *
+ *
+ * - Slug:
min-cost-climbing-stairs
+ * - Difficulty: Easy
+ *
+ *
+ * Solution progression:
+ *
+ *
+ * - {@code SolutionDp} — Bottom-up DP,
O(n) time, O(n) space
+ * - {@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));
+ }
+}