Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
0cb20d5
Add solution for Challenge 1 by PolinaSvet
PolinaSvet Jul 14, 2025
bc13c77
Add solution for Challenge 2 by PolinaSvet
PolinaSvet Jul 14, 2025
aed1c1d
Revert the changes to solution_template for Challenge 1
PolinaSvet Jul 15, 2025
7326f43
Add solution for Challenge 3 by PolinaSvet
PolinaSvet Jul 15, 2025
44c5a71
Add solution for Challenge 6 by PolinaSvet
PolinaSvet Jul 15, 2025
b2ea968
Add solution for Challenge 18 by PolinaSvet
PolinaSvet Jul 15, 2025
47d9630
Merge branch 'RezaSi:main' into main
PolinaSvet Jul 16, 2025
809e36c
Add solution for Challenge 21 by PolinaSvet
PolinaSvet Jul 16, 2025
92d3747
Add solution for Challenge 22 by PolinaSvet
PolinaSvet Jul 22, 2025
93153f4
Merge branch 'RezaSi:main' into main
PolinaSvet Jul 23, 2025
3f9cfc5
Add solution for Challenge 4 by PolinaSvet
PolinaSvet Jul 23, 2025
999945d
Add solution for Challenge 5 by PolinaSvet
PolinaSvet Jul 23, 2025
fde08f1
Add solution for Challenge 7 by PolinaSvet
PolinaSvet Jul 24, 2025
738d965
Add solution for Challenge 10 by PolinaSvet
PolinaSvet Jul 24, 2025
b32557e
Add solution for Challenge 13 by PolinaSvet
PolinaSvet Jul 24, 2025
1e108f9
Merge branch 'RezaSi:main' into main
PolinaSvet Jul 31, 2025
abe8c31
Add solution for Challenge 14 by PolinaSvet
PolinaSvet Jul 31, 2025
c6974eb
Add solution for Challenge 16 by PolinaSvet
PolinaSvet Aug 1, 2025
cf6e354
Add solution for Challenge 17 by PolinaSvet
PolinaSvet Aug 1, 2025
8b1120b
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 4, 2025
0b30c71
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 12, 2025
9cd39f0
Add solution for Challenge 19 by PolinaSvet
PolinaSvet Aug 12, 2025
651fb1d
Add solution for Challenge 20 by PolinaSvet
PolinaSvet Aug 13, 2025
39f8643
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 13, 2025
9128a2a
Add solution for Challenge 23 by PolinaSvet
PolinaSvet Aug 14, 2025
5b78619
Add solution for Challenge 27 by PolinaSvet
PolinaSvet Aug 14, 2025
94fa4ce
Add solution for Challenge 30 by PolinaSvet
PolinaSvet Aug 14, 2025
7c45e51
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 14, 2025
5737d8f
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 15, 2025
419f079
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 20, 2025
781b26b
Add solution for Challenge 8 by PolinaSvet
PolinaSvet Aug 20, 2025
3062113
Add solution for Challenge 9 by PolinaSvet
PolinaSvet Aug 22, 2025
79bad04
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 22, 2025
f159e43
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 25, 2025
d9d5361
Add solution for Challenge 11 by PolinaSvet
PolinaSvet Aug 25, 2025
9507b6a
Add solution for Challenge 12 by PolinaSvet
PolinaSvet Aug 26, 2025
2335a21
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 26, 2025
a6d35c8
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 27, 2025
68fd797
Add solution for Challenge 15 by PolinaSvet
PolinaSvet Aug 28, 2025
09bda7d
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 28, 2025
c252759
Merge branch 'RezaSi:main' into main
PolinaSvet Aug 29, 2025
9bfadaa
Add solution for Challenge 24 by PolinaSvet
PolinaSvet Aug 29, 2025
1dcf6af
Add solution for Challenge 25 by PolinaSvet
PolinaSvet Sep 1, 2025
1b01312
Add solution for Challenge 26 by PolinaSvet
PolinaSvet Sep 1, 2025
6659286
Merge branch 'RezaSi:main' into main
PolinaSvet Sep 1, 2025
2168a50
Add solution for Challenge 28 by PolinaSvet
PolinaSvet Sep 2, 2025
495d5d9
Merge branch 'main' into main
RezaSi Sep 2, 2025
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
219 changes: 219 additions & 0 deletions challenge-24/submissions/PolinaSvet/solution-template.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
package main

import (
"fmt"
"math/rand"
"runtime"
"time"
)

func main() {
// Test cases
testCases := []struct {
name string
nums []int
}{
{"Example 01: 4", []int{10, 9, 2, 5, 3, 7, 101, 18}},
{"Example 02: 4", []int{0, 1, 0, 3, 2, 3}},
{"Example 03: 1", []int{7, 7, 7, 7, 7, 7, 7}},
{"Example 04: 3", []int{4, 10, 4, 3, 8, 9}},
{"Example 05: 0", []int{}},
{"Example 06: 1", []int{5}},
{"Example 07: 1", []int{5, 4, 3, 2, 1}},
{"Example 08: 5", []int{1, 2, 3, 4, 5}},
{"Example 09: 3", []int{3, 10, 2, 1, 20}},
{"Example 10: 4", []int{50, 3, 10, 7, 40, 80}},
}

// Test each approach
for _, tc := range testCases {
dpLength := DPLongestIncreasingSubsequence(tc.nums)
fmt.Printf("Standart%s = %d, %v\n", tc.name, dpLength, tc.nums)

optLength := OptimizedLIS(tc.nums)
fmt.Printf("OPT_____%s = %d, %v\n", tc.name, optLength, tc.nums)

lisElements := GetLISElements(tc.nums)
fmt.Printf("LIS Elements: %v\n", lisElements)
fmt.Println("-----------------------------------")
}

fmt.Println("\n=== Performance Tests ===")
runPerformanceTests()

fmt.Println("\n=== Memory Usage Tests ===")
runMemoryTests()
}

// DPLongestIncreasingSubsequence finds the length of the longest increasing subsequence
// using a standard dynamic programming approach with O(n²) time complexity.
func DPLongestIncreasingSubsequence(nums []int) int {
// TODO: Implement this function
if len(nums) == 0 {
return 0
}

dp := make([]int, len(nums))
for i := range dp {
dp[i] = 1
}

maxLength := 1
for i := 1; i < len(nums); i++ {
for j := 0; j < i; j++ {
if nums[i] > nums[j] {
if dp[j]+1 > dp[i] {
dp[i] = dp[j] + 1
}
}
}
if dp[i] > maxLength {
maxLength = dp[i]
}
}

return maxLength
}

// OptimizedLIS finds the length of the longest increasing subsequence
// using an optimized approach with O(n log n) time complexity.
func OptimizedLIS(nums []int) int {
// TODO: Implement this function
if len(nums) == 0 {
return 0
}

tails := make([]int, 0)
tails = append(tails, nums[0])

for i := 1; i < len(nums); i++ {
if nums[i] > tails[len(tails)-1] {
tails = append(tails, nums[i])
} else {

left, right := 0, len(tails)-1
for left < right {
mid := left + (right-left)/2
if tails[mid] < nums[i] {
left = mid + 1
} else {
right = mid
}
}
tails[left] = nums[i]
}
}

return len(tails)
}

// GetLISElements returns one possible longest increasing subsequence
// (not just the length, but the actual elements).
func GetLISElements(nums []int) []int {
// TODO: Implement this function
if len(nums) == 0 {
return nil
}

dp := make([]int, len(nums))
prev := make([]int, len(nums))
for i := range dp {
dp[i] = 1
prev[i] = -1
}

maxLength := 1
maxIndex := 0

for i := 1; i < len(nums); i++ {
for j := 0; j < i; j++ {
if nums[i] > nums[j] && dp[j]+1 > dp[i] {
dp[i] = dp[j] + 1
prev[i] = j
}
}
if dp[i] > maxLength {
maxLength = dp[i]
maxIndex = i
}
}

lis := make([]int, maxLength)
for i := maxLength - 1; i >= 0; i-- {
lis[i] = nums[maxIndex]
maxIndex = prev[maxIndex]
if maxIndex == -1 {
break
}
}

return lis
}

func generateTestData(size int) []int {
rand.Seed(time.Now().UnixNano())
data := make([]int, size)
for i := range data {
data[i] = rand.Intn(size * 2)
}
return data
}

func runPerformanceTests() {
sizes := []int{100, 500, 1000, 2000, 5000}
iterations := 10

for _, size := range sizes {
fmt.Printf("\nTesting with size %d (%d iterations):\n", size, iterations)
testData := generateTestData(size)

var totalTime1, totalTime2 time.Duration

for i := 0; i < iterations; i++ {
start := time.Now()
DPLongestIncreasingSubsequence(testData)
totalTime1 += time.Since(start)
}

for i := 0; i < iterations; i++ {
start := time.Now()
OptimizedLIS(testData)
totalTime2 += time.Since(start)
}

avgTime1 := totalTime1 / time.Duration(iterations)
avgTime2 := totalTime2 / time.Duration(iterations)

fmt.Printf("Standart: avg time: %v\n", avgTime1)
fmt.Printf("OPT_____: avg time: %v\n", avgTime2)

}
}

// Memory test function
func runMemoryTests() {
sizes := []int{100, 500, 1000, 2000}

for _, size := range sizes {
fmt.Printf("\nMemory test with size %d:\n", size)
testData := generateTestData(size)

var m1, m2 runtime.MemStats

runtime.GC()
runtime.ReadMemStats(&m1)
mResult1 := DPLongestIncreasingSubsequence(testData)
runtime.ReadMemStats(&m2)
mMemory1 := m2.Alloc - m1.Alloc

runtime.GC()
runtime.ReadMemStats(&m1)
mResult2 := OptimizedLIS(testData)
runtime.ReadMemStats(&m2)
mMemory2 := m2.Alloc - m1.Alloc

fmt.Printf("Standart: result=%d, memory=%d bytes\n", mResult1, mMemory1)
fmt.Printf("OPT_____: result=%d, memory=%d bytes\n", mResult2, mMemory2)

}
}
Loading
Loading