Skip to content

Commit 25a30e7

Browse files
Up to course-schedule-ii
1 parent bd9b852 commit 25a30e7

16 files changed

+1612
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.vscode/

binary-tree-maximum-path-sum.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package main
2+
3+
type TreeNode struct {
4+
Val int
5+
Left *TreeNode
6+
Right *TreeNode
7+
}
8+
9+
func max2(a, b int) int {
10+
if a > b {
11+
return a
12+
}
13+
14+
return b
15+
}
16+
17+
func max3(a, b, c int) int {
18+
return max2(a, max2(b, c))
19+
}
20+
21+
func traverse(root *TreeNode, maxSum *int) int {
22+
if root == nil {
23+
return 0
24+
}
25+
26+
lPathMaxSum := traverse(root.Left, maxSum)
27+
rPathMaxSum := traverse(root.Right, maxSum)
28+
rootPathMaxSum := max3(root.Val, root.Val+lPathMaxSum, root.Val+rPathMaxSum)
29+
30+
*maxSum = max3(*maxSum, root.Val+lPathMaxSum+rPathMaxSum, rootPathMaxSum)
31+
32+
return rootPathMaxSum
33+
}
34+
35+
func maxPathSum(root *TreeNode) int {
36+
if root == nil {
37+
return 0
38+
}
39+
40+
maxSum := root.Val
41+
traverse(root, &maxSum)
42+
43+
return maxSum
44+
}
45+
46+
func main() {
47+
48+
}

course-schedule-ii.go

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
package main
2+
3+
import "fmt"
4+
5+
type intSet struct {
6+
size int
7+
elements map[int]struct{}
8+
}
9+
10+
func NewIntSet() intSet {
11+
return intSet{size: 0, elements: make(map[int]struct{})}
12+
}
13+
14+
func (s *intSet) Add(elem int) {
15+
if _, exists := s.elements[elem]; !exists {
16+
s.elements[elem] = struct{}{}
17+
s.size++
18+
}
19+
20+
return
21+
}
22+
23+
func (s *intSet) Remove(elem int) {
24+
if _, exists := s.elements[elem]; exists {
25+
delete(s.elements, elem)
26+
s.size--
27+
}
28+
29+
return
30+
}
31+
32+
func (s *intSet) Contains(elem int) bool {
33+
_, exists := s.elements[elem]
34+
35+
return exists
36+
}
37+
38+
func (s *intSet) GetAnyElement() (int, error) {
39+
if len(s.elements) == 0 {
40+
return 0, fmt.Errorf("set is empty")
41+
}
42+
43+
var elem int
44+
for k, _ := range s.elements {
45+
elem = k
46+
47+
break
48+
}
49+
50+
return elem, nil
51+
}
52+
53+
// Return true if cycle exists.
54+
func checkCycleFrom(start int, adjs [][]int, whiteSet, graySet, blackSet intSet) bool {
55+
if blackSet.Contains(start) {
56+
return false
57+
}
58+
59+
if graySet.Contains(start) {
60+
return true
61+
}
62+
63+
if whiteSet.Contains(start) {
64+
whiteSet.Remove(start)
65+
graySet.Add(start)
66+
}
67+
68+
// Explore all adjacencies
69+
for i := 0; i < len(adjs[start]); i++ {
70+
cycleExists := checkCycleFrom(adjs[start][i], adjs, whiteSet, graySet, blackSet)
71+
72+
if cycleExists {
73+
return true
74+
}
75+
}
76+
77+
graySet.Remove(start)
78+
blackSet.Add(start)
79+
80+
return false
81+
}
82+
83+
func checkCycle(adjs [][]int) bool {
84+
whiteSet, graySet, blackSet := NewIntSet(), NewIntSet(), NewIntSet()
85+
86+
for i := 0; i < len(adjs); i++ {
87+
whiteSet.Add(i)
88+
}
89+
90+
for {
91+
elem, err := whiteSet.GetAnyElement()
92+
93+
if err != nil {
94+
break
95+
}
96+
97+
if checkCycleFrom(elem, adjs, whiteSet, graySet, blackSet) {
98+
return true
99+
}
100+
}
101+
102+
return false
103+
}
104+
105+
func topologicalTraversal(start int, adjs [][]int, visited map[int]struct{}, traversal []int) []int {
106+
if _, exists := visited[start]; exists {
107+
return traversal
108+
}
109+
110+
for _, to := range adjs[start] {
111+
traversal = topologicalTraversal(to, adjs, visited, traversal)
112+
}
113+
114+
visited[start] = struct{}{}
115+
traversal = append(traversal, start)
116+
117+
return traversal
118+
}
119+
120+
func findOrder(numCourses int, prerequisites [][]int) []int {
121+
adjs := make([][]int, numCourses)
122+
123+
for i, _ := range adjs {
124+
adjs[i] = []int{}
125+
}
126+
127+
visited := make(map[int]struct{})
128+
leafCheck := make([]bool, numCourses)
129+
130+
for i, _ := range leafCheck {
131+
leafCheck[i] = true
132+
}
133+
134+
for _, pair := range prerequisites {
135+
from, to := pair[0], pair[1]
136+
137+
adjs[from] = append(adjs[from], to)
138+
139+
leafCheck[to] = false
140+
}
141+
142+
if checkCycle(adjs) {
143+
return []int{}
144+
}
145+
146+
order := []int{}
147+
148+
for i := 0; i < numCourses; i++ {
149+
if leafCheck[i] {
150+
// leaf course - this is a course that no other course depends on
151+
order = topologicalTraversal(i, adjs, visited, order)
152+
}
153+
}
154+
155+
for i := 0; i < numCourses; i++ {
156+
if _, exists := visited[i]; !exists {
157+
return []int{}
158+
}
159+
}
160+
161+
return order
162+
}
163+
164+
type testcase struct {
165+
numCourses int
166+
preReqs [][]int
167+
}
168+
169+
func tests() {
170+
testcases := []testcase{
171+
testcase{numCourses: 2, preReqs: [][]int{[]int{1, 0}}},
172+
testcase{numCourses: 4, preReqs: [][]int{[]int{1, 0}, []int{2, 0}, []int{3, 1}, []int{3, 2}}},
173+
testcase{numCourses: 3, preReqs: [][]int{[]int{0, 2}, []int{1, 2}, []int{2, 0}}},
174+
}
175+
176+
for i, tc := range testcases {
177+
order := findOrder(tc.numCourses, tc.preReqs)
178+
179+
fmt.Printf("Test case: %d; order: %v\n", i, order)
180+
}
181+
}
182+
183+
func main() {
184+
// tests()
185+
s1 := NewIntSet()
186+
187+
s1.Add(4)
188+
189+
fmt.Printf("s1.size = %d\n", s1.size)
190+
}

delete-columns-to-make-sorted-ii.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func minDeletionSize(A []string) int {
6+
charss := make([][]rune, len(A))
7+
8+
for i, _ := range A {
9+
charss[i] = []rune(A[i])
10+
}
11+
12+
strictlyGreater := make([]bool, len(A))
13+
numDeletions := 0
14+
15+
for j := 0; j < len(A[0]); j++ {
16+
monotonicIncreasing := true
17+
18+
for i := 1; i < len(A); i++ {
19+
if charss[i-1][j] >= charss[i][j] {
20+
monotonicIncreasing = false
21+
}
22+
23+
if charss[i-1][j] > charss[i][j] {
24+
if strictlyGreater[i] {
25+
continue
26+
}
27+
28+
// inversion
29+
if j == 0 {
30+
// inversion in first column
31+
numDeletions++
32+
33+
for k := 0; k < len(A); k++ {
34+
charss[k][j] = '_'
35+
}
36+
37+
break
38+
} else {
39+
// inversion that's not in first column
40+
if charss[i-1][j-1] == charss[i][j-1] {
41+
// copy previous column and delete this one
42+
numDeletions++
43+
44+
for k := 0; k < len(A); k++ {
45+
charss[k][j] = charss[k][j-1]
46+
}
47+
48+
break
49+
}
50+
}
51+
}
52+
}
53+
54+
for i := 1; i < len(A); i++ {
55+
if charss[i-1][j] < charss[i][j] {
56+
strictlyGreater[i] = true
57+
}
58+
}
59+
60+
if monotonicIncreasing {
61+
return numDeletions
62+
}
63+
}
64+
65+
return numDeletions
66+
}
67+
68+
func test1() {
69+
A := []string{
70+
"ca",
71+
"bb",
72+
"ac",
73+
}
74+
75+
fmt.Printf("minDeletions: %d\n", minDeletionSize(A))
76+
}
77+
78+
func test2() {
79+
A := []string{
80+
"xc",
81+
"yb",
82+
"za",
83+
}
84+
85+
fmt.Printf("minDeletions: %d\n", minDeletionSize(A))
86+
}
87+
88+
func test3() {
89+
A := []string{
90+
"zyx",
91+
"wvu",
92+
"tsr",
93+
}
94+
95+
fmt.Printf("minDeletions: %d\n", minDeletionSize(A))
96+
}
97+
98+
func main() {
99+
// test1()
100+
// test2()
101+
test3()
102+
}

deo-evaporator.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"math"
6+
)
7+
8+
func Evaporator(content float64, evapPerDay int, threshold int) int {
9+
// your code
10+
n := math.Log10(float64(threshold) / 100) / math.Log10(1 - float64(evapPerDay) / 100.0)
11+
12+
return int(math.Ceil(n))
13+
}
14+
15+
func main() {
16+
fmt.Printf("%d\n", Evaporator(10, 10, 10))
17+
fmt.Printf("%d\n", Evaporator(10, 10, 5))
18+
fmt.Printf("%d\n", Evaporator(100, 5, 5))
19+
}

0 commit comments

Comments
 (0)