From 2f200e4b2a6fb652b244570fe6e4603087862e29 Mon Sep 17 00:00:00 2001 From: Igor Wojda Date: Tue, 18 Jul 2023 17:52:04 +0200 Subject: [PATCH 1/6] Init --- .../list/medianoftwosorted/Challenge.kt | 20 +++++++++++ .../list/medianoftwosorted/README.md | 16 +++++++++ .../list/medianoftwosorted/Solution.kt | 34 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt create mode 100644 src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md create mode 100644 src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt new file mode 100644 index 00000000..3b1e87e9 --- /dev/null +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt @@ -0,0 +1,20 @@ +package com.igorwojda.list.medianoftwosorted + +import org.amshove.kluent.shouldBeEqualTo +import org.junit.jupiter.api.Test + +fun medianOfSortedLists(list1: List, list2: List): Double { + +} + +private class Test { + @Test + fun `median of sorted lists 1, 3 and 2 returns 2`() { + medianOfSortedLists(listOf(1, 3), listOf(2)) shouldBeEqualTo 2 + } + + @Test + fun `median of sorted lists 1, 2 and 3,4 returns 2,5`() { + medianOfSortedLists(listOf(1, 3), listOf(2)) shouldBeEqualTo 2.5 + } +} diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md new file mode 100644 index 00000000..e2f2f28b --- /dev/null +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md @@ -0,0 +1,16 @@ +# MMedia + +## Instructions + +Given two sorted lists `list1` and `list2` of size `m` and `n` respectively, +return the median of the two sorted lists. + +[Challenge](Challenge.kt) | [Solution](Solution.kt) + +## Examples + +```kotlin +findMedianSortedLists(listOf(1, 3), listOf(2) // 2.0 (merged array = [1,2,3] and median is 2) + +findMedianSortedLists(listOf(1, 2), listOf(3, 4)) // 2.5 (merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5) +``` diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt new file mode 100644 index 00000000..513e95b4 --- /dev/null +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt @@ -0,0 +1,34 @@ +package com.igorwojda.list.medianoftwosorted + +// Time complexity: O(log (m+n)) +private object Solution1 { + fun medianOfSortedLists(nums1: IntArray, nums2: IntArray): Double { + val mergedArray = nums1.plus(nums2) + mergedArray.sort() + + val median = if (mergedArray.size % 2 != 0) { + mergedArray[mergedArray.size / 2].toDouble() + } else { + (mergedArray[mergedArray.size / 2].toDouble() + mergedArray[mergedArray.size / 2 - 1].toDouble()) / 2 + } + return median + } +} + +// Time complexity: O(n) +// Space complexity O(n) +private object Solution2 { + fun medianOfSortedLists(nums1: IntArray, nums2: IntArray): Double { + val mergedArray = nums1.plus(nums2) + mergedArray.sort() + + val median = if (mergedArray.size % 2 != 0) { + mergedArray[mergedArray.size / 2].toDouble() + } else { + (mergedArray[mergedArray.size / 2].toDouble() + mergedArray[mergedArray.size / 2 - 1].toDouble()) / 2 + } + return median + } +} + +private object KtLintWillNotComplain From 126d0d731f8172e99ee9ba071acf69c6d4a8fd66 Mon Sep 17 00:00:00 2001 From: Igor Wojda Date: Thu, 20 Jul 2023 14:42:05 +0200 Subject: [PATCH 2/6] Update solution --- .../list/medianoftwosorted/Challenge.kt | 33 +++++++- .../list/medianoftwosorted/README.md | 11 ++- .../list/medianoftwosorted/Solution.kt | 77 +++++++++++++++---- 3 files changed, 96 insertions(+), 25 deletions(-) diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt index 3b1e87e9..f289e02e 100644 --- a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Challenge.kt @@ -4,17 +4,42 @@ import org.amshove.kluent.shouldBeEqualTo import org.junit.jupiter.api.Test fun medianOfSortedLists(list1: List, list2: List): Double { + val mergedList = list1 + .plus(list2) + .sorted() + val median = if (mergedList.size % 2 != 0) { + mergedList[mergedList.size / 2].toDouble() + } else { + (mergedList[mergedList.size / 2].toDouble() + mergedList[mergedList.size / 2 - 1].toDouble()) / 2 + } + + return median } private class Test { @Test - fun `median of sorted lists 1, 3 and 2 returns 2`() { - medianOfSortedLists(listOf(1, 3), listOf(2)) shouldBeEqualTo 2 + fun `median of sorted lists 1, 3 and 2 returns 2,0`() { + medianOfSortedLists(listOf(1, 3), listOf(2)) shouldBeEqualTo 2.0 + } + + @Test + fun `median of sorted lists 1, 3 and 2 returns 2,5`() { + medianOfSortedLists(listOf(1, 2), listOf(3, 4)) shouldBeEqualTo 2.5 + } + + @Test + fun `median of sorted lists 2 and 1, 3 returns 2,0`() { + medianOfSortedLists(listOf(2), listOf(1, 3)) shouldBeEqualTo 2.0 + } + + @Test + fun `median of sorted lists 1, 3, 4 and 2 returns 3,5`() { + medianOfSortedLists(listOf(1, 5, 7), listOf(2)) shouldBeEqualTo 3.5 } @Test - fun `median of sorted lists 1, 2 and 3,4 returns 2,5`() { - medianOfSortedLists(listOf(1, 3), listOf(2)) shouldBeEqualTo 2.5 + fun `median of sorted lists 2 and 1, 3, 4 returns 4,0`() { + medianOfSortedLists(listOf(2), listOf(1, 6, 7)) shouldBeEqualTo 4.0 } } diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md index e2f2f28b..ae29e428 100644 --- a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md @@ -2,15 +2,18 @@ ## Instructions -Given two sorted lists `list1` and `list2` of size `m` and `n` respectively, -return the median of the two sorted lists. +Given two sorted lists `list1` and `list2` of integers return the median of the two sorted lists. + +The overall run time complexity should be `O(log (m+n))`. [Challenge](Challenge.kt) | [Solution](Solution.kt) ## Examples ```kotlin -findMedianSortedLists(listOf(1, 3), listOf(2) // 2.0 (merged array = [1,2,3] and median is 2) +medianOfSortedLists(listOf(1, 3), listOf(2)) // 2.0 (merged list = [1, 2, 3] and median is 2) + +medianOfSortedLists(listOf(1, 2), listOf(3, 4)) // 2.5 (merged list = [1, 2, 3, 4] and median is (2 + 3) / 2 = 2.5) -findMedianSortedLists(listOf(1, 2), listOf(3, 4)) // 2.5 (merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5) +medianOfSortedLists(listOf(1, 5, 7), listOf(2)) // 3.5 (merged list = [1, 2, 5, 7] and median is (2 + 5) / 2 = 3.5) ``` diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt index 513e95b4..4f4380f0 100644 --- a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt @@ -1,34 +1,77 @@ package com.igorwojda.list.medianoftwosorted // Time complexity: O(log (m+n)) -private object Solution1 { - fun medianOfSortedLists(nums1: IntArray, nums2: IntArray): Double { - val mergedArray = nums1.plus(nums2) - mergedArray.sort() +private object Solution { + fun medianOfSortedLists(list1: List, list2: List): Double { + val totalSize = list1.size + list2.size - val median = if (mergedArray.size % 2 != 0) { - mergedArray[mergedArray.size / 2].toDouble() - } else { - (mergedArray[mergedArray.size / 2].toDouble() + mergedArray[mergedArray.size / 2 - 1].toDouble()) / 2 + val lastIndex = (totalSize / 2) + var prevValue: Int? = null + + var pointer1Index = 0 + var pointer2Index = 0 + + (0..lastIndex).forEach { + val value1 = list1.getOrNull(pointer1Index) + val value2 = list2.getOrNull(pointer2Index) + + val minValue = when { + value1 != null && value2 == null -> { + pointer1Index++ + value1 + } + value2 != null && value1 == null -> { + pointer2Index++ + value2 + } + value1!! < value2!! -> { + pointer1Index++ + value1 + } + else -> { + pointer2Index++ + value2 + } + } + + if (it == lastIndex) { + val totalSizeIsOdd = totalSize % 2 != 0 + + return if (totalSizeIsOdd) { + return minValue.toDouble() + } else { + val localPrevValue = prevValue + + if (localPrevValue == null) { + minValue.toDouble() + } else { + (localPrevValue + minValue) / 2.0 + } + } + } + + prevValue = minValue + println("-----------") } - return median + + return 0.0 } } // Time complexity: O(n) // Space complexity O(n) private object Solution2 { - fun medianOfSortedLists(nums1: IntArray, nums2: IntArray): Double { - val mergedArray = nums1.plus(nums2) - mergedArray.sort() + fun medianOfSortedLists(list1: IntArray, list2: IntArray): Double { + val mergedList = list1 + .plus(list2) + .sorted() - val median = if (mergedArray.size % 2 != 0) { - mergedArray[mergedArray.size / 2].toDouble() + val median = if (mergedList.size % 2 != 0) { + mergedList[mergedList.size / 2].toDouble() } else { - (mergedArray[mergedArray.size / 2].toDouble() + mergedArray[mergedArray.size / 2 - 1].toDouble()) / 2 + (mergedList[mergedList.size / 2].toDouble() + mergedList[mergedList.size / 2 - 1].toDouble()) / 2 } + return median } } - -private object KtLintWillNotComplain From 5dfe8a32c9ab8a32e1774298a86c37de161c6092 Mon Sep 17 00:00:00 2001 From: Igor Wojda Date: Thu, 20 Jul 2023 14:55:36 +0200 Subject: [PATCH 3/6] Rename solution --- .../kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt index 4f4380f0..22925214 100644 --- a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt @@ -1,7 +1,7 @@ package com.igorwojda.list.medianoftwosorted // Time complexity: O(log (m+n)) -private object Solution { +private object Solution1 { fun medianOfSortedLists(list1: List, list2: List): Double { val totalSize = list1.size + list2.size From 48dc95c21c51e069ed5e1aba2ea8e49ddb67db91 Mon Sep 17 00:00:00 2001 From: Igor Wojda Date: Thu, 20 Jul 2023 14:56:50 +0200 Subject: [PATCH 4/6] Upd title --- src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md | 2 +- src/test/kotlin/com/igorwojda/list/pairaverage/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md index ae29e428..316b48be 100644 --- a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md @@ -1,4 +1,4 @@ -# MMedia +# Median Of Two Sorted Lists ## Instructions diff --git a/src/test/kotlin/com/igorwojda/list/pairaverage/README.md b/src/test/kotlin/com/igorwojda/list/pairaverage/README.md index ae6e8a1d..8a43554f 100644 --- a/src/test/kotlin/com/igorwojda/list/pairaverage/README.md +++ b/src/test/kotlin/com/igorwojda/list/pairaverage/README.md @@ -1,4 +1,4 @@ -# Find the pair with average +# The pair with average ## Instructions From 778ebe51e4d3f46d92f4681dcea6c1631a83ea3a Mon Sep 17 00:00:00 2001 From: Igor Wojda Date: Thu, 20 Jul 2023 15:00:27 +0200 Subject: [PATCH 5/6] Upd readme --- README.md | 5 +++-- misc/ChallengeGroups.md | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fcde6736..cf198500 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Keep in mind that each challenge will usually have more than one solution. Even [10 different ways](https://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/). Usually, we compare various solutions using ([Big O notation](https://medium.com/karuna-sehgal/a-simplified-explanation-of-the-big-o-notation-82523585e835)) to -determine space/time complexity and we look at code readability. +determine space/time complexity, and we look at code readability. ## How do I start? @@ -47,7 +47,7 @@ look at [problem-solving strategy](https://github.com/igorwojda/kotlin-coding-ch Take your time before you view the presented solution. To succeed you need to practice often, repeat the same challenges multiple times and be persistent over time. -**Good luck!** +**Good luck! 🤞** **New in Town** @@ -130,6 +130,7 @@ multiple times and be persistent over time. - [Min sub list length](src/test/kotlin/com/igorwojda/list/minsublistlength) - [Subtract](src/test/kotlin/com/igorwojda/list/subtract) - [Coins](src/test/kotlin/com/igorwojda/list/coins) +- [Medan Of Sorted Lists](src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md) # Useful links diff --git a/misc/ChallengeGroups.md b/misc/ChallengeGroups.md index 01a10e04..7234aebf 100644 --- a/misc/ChallengeGroups.md +++ b/misc/ChallengeGroups.md @@ -42,6 +42,7 @@ loops which decreases complexity from `O(n^2)` to `O(n)`. - [Get duplicated arguments](../src/test/kotlin/com/igorwojda/string/getduplicatedarguments/README.md) - [Midpoint](../src/test/kotlin/com/igorwojda/linkedlist/singly/midpoint/README.md) - [Circular check](../src/test/kotlin/com/igorwojda/linkedlist/singly/circularcheck/README.md) +- [Medan Of Sorted Lists](../src/test/kotlin/com/igorwojda/list/medianoftwosorted/README.md) ## Frequency counter From 351c49c3f221d865a7fa5f60c9ca2638d12e0cd6 Mon Sep 17 00:00:00 2001 From: Igor Wojda Date: Thu, 20 Jul 2023 15:04:42 +0200 Subject: [PATCH 6/6] Upd type --- .../kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt index 22925214..c1d86e70 100644 --- a/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt +++ b/src/test/kotlin/com/igorwojda/list/medianoftwosorted/Solution.kt @@ -61,7 +61,7 @@ private object Solution1 { // Time complexity: O(n) // Space complexity O(n) private object Solution2 { - fun medianOfSortedLists(list1: IntArray, list2: IntArray): Double { + fun medianOfSortedLists(list1: List, list2: List): Double { val mergedList = list1 .plus(list2) .sorted()