Skip to content

Commit f568ad4

Browse files
Up till sort-colors
1 parent d794dc2 commit f568ad4

File tree

4 files changed

+435
-0
lines changed

4 files changed

+435
-0
lines changed

minimum-area-rectangle-ii.go

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"math"
7+
"sort"
8+
)
9+
10+
type Diagonal struct {
11+
x1, y1, x2, y2 float64
12+
length float64
13+
}
14+
15+
type ByLen []Diagonal
16+
17+
func (ds ByLen) Len() int {
18+
return len(ds)
19+
}
20+
21+
func (ds ByLen) Swap(i, j int) {
22+
ds[i], ds[j] = ds[j], ds[i]
23+
}
24+
25+
func (ds ByLen) Less(i, j int) bool {
26+
return ds[i].length < ds[j].length
27+
}
28+
29+
func distance(x1, y1, x2, y2 float64) float64 {
30+
d := (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)
31+
return math.Sqrt(d)
32+
}
33+
34+
func between(a, b, c float64) bool {
35+
if (c >= a && c <= b) || (c >= b && c <= a) {
36+
return true
37+
}
38+
39+
return false
40+
}
41+
42+
func intersection(d1, d2 Diagonal) (x float64, y float64, err error) {
43+
x1, y1 := d1.x1, d1.y1
44+
x2, y2 := d1.x2, d1.y2
45+
x3, y3 := d2.x1, d2.y1
46+
x4, y4 := d2.x2, d2.y2
47+
48+
den := (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4)
49+
50+
if den == 0 {
51+
return 0, 0, errors.New("No intersection")
52+
}
53+
54+
ix := ((x1*y2-y1*x2)*(x3-x4) - (x1-x2)*(x3*y4-y3*x4)) / den
55+
iy := ((x1*y2-y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)) / den
56+
57+
if between(x1, x2, ix) && between(x3, x4, ix) && between(y1, y2, iy) && between(y3, y4, iy) {
58+
return ix, iy, nil
59+
}
60+
61+
return 0, 0, errors.New("No intersection")
62+
}
63+
64+
func epseq(v1, v2 float64) bool {
65+
return (math.Abs(v1-v2) <= 0.00001)
66+
}
67+
68+
func diagonalMidPoint(d Diagonal, x, y float64) bool {
69+
dist1 := distance(d.x1, d.y1, x, y)
70+
dist2 := distance(d.x2, d.y2, x, y)
71+
72+
return epseq(dist1, dist2)
73+
}
74+
75+
func minAreaFreeRect(points [][]int) float64 {
76+
n := len(points)
77+
78+
diagonals := make([]Diagonal, (n*(n-1))/2)
79+
80+
// fmt.Printf("num diags: %d\n", len(diagonals))
81+
82+
k := 0
83+
for i := 0; i < n; i++ {
84+
for j := i + 1; j < n; j++ {
85+
d := Diagonal{x1: float64(points[i][0]), y1: float64(points[i][1]), x2: float64(points[j][0]), y2: float64(points[j][1])}
86+
d.length = distance(d.x1, d.y1, d.x2, d.y2)
87+
diagonals[k] = d
88+
89+
k++
90+
}
91+
}
92+
93+
byLen := ByLen(diagonals)
94+
sort.Sort(byLen)
95+
96+
// fmt.Printf("diagonals: %v\n", diagonals)
97+
98+
minArea := math.MaxFloat64
99+
rectFound := false
100+
101+
for i := 0; i < byLen.Len(); i++ {
102+
for j := i + 1; j < byLen.Len(); j++ {
103+
if epseq(diagonals[i].length, diagonals[j].length) {
104+
// get intersection
105+
if ix, iy, err := intersection(diagonals[i], diagonals[j]); err == nil {
106+
if diagonalMidPoint(diagonals[i], ix, iy) && diagonalMidPoint(diagonals[j], ix, iy) {
107+
// This is a rectangle calculate area
108+
rectFound = true
109+
110+
l := distance(diagonals[i].x1, diagonals[i].y1, diagonals[j].x1, diagonals[j].y1)
111+
w := distance(diagonals[i].x1, diagonals[i].y1, diagonals[j].x2, diagonals[j].y2)
112+
113+
minArea = math.Min(minArea, l*w)
114+
}
115+
}
116+
} else {
117+
break
118+
}
119+
}
120+
}
121+
122+
if !rectFound {
123+
return 0.0
124+
}
125+
126+
return minArea
127+
}
128+
129+
func test1() {
130+
points := [][]int{
131+
[]int{0, 1},
132+
[]int{2, 1},
133+
[]int{1, 1},
134+
[]int{1, 0},
135+
[]int{2, 0},
136+
}
137+
138+
fmt.Printf("ans: %f\n", minAreaFreeRect(points))
139+
}
140+
141+
func test2() {
142+
points := [][]int{
143+
[]int{0, 3},
144+
[]int{1, 2},
145+
[]int{3, 1},
146+
[]int{1, 3},
147+
[]int{2, 1},
148+
}
149+
150+
fmt.Printf("ans: %f\n", minAreaFreeRect(points))
151+
}
152+
153+
func test3() {
154+
points := [][]int{
155+
[]int{3, 1},
156+
[]int{1, 1},
157+
[]int{0, 1},
158+
[]int{2, 1},
159+
[]int{3, 3},
160+
[]int{3, 2},
161+
[]int{0, 2},
162+
[]int{2, 3},
163+
}
164+
165+
fmt.Printf("ans: %f\n", minAreaFreeRect(points))
166+
}
167+
168+
func test4() {
169+
points := [][]int{
170+
[]int{1, 2},
171+
[]int{2, 1},
172+
[]int{1, 0},
173+
[]int{0, 1},
174+
}
175+
176+
fmt.Printf("ans: %f\n", minAreaFreeRect(points))
177+
}
178+
179+
func main() {
180+
test1()
181+
test2()
182+
test3()
183+
test4()
184+
}

search-a-2d-matrix.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func binSearch(matrix [][]int, target, low, high, rows, cols int) bool {
6+
if low > high {
7+
return false
8+
}
9+
10+
mid := (low + high) / 2
11+
midRow := mid / cols
12+
midCol := mid % cols
13+
14+
if matrix[midRow][midCol] == target {
15+
return true
16+
}
17+
18+
if matrix[midRow][midCol] < target {
19+
return binSearch(matrix, target, mid+1, high, rows, cols)
20+
}
21+
22+
return binSearch(matrix, target, low, mid-1, rows, cols)
23+
}
24+
25+
func searchMatrix(matrix [][]int, target int) bool {
26+
rows := len(matrix)
27+
28+
if rows == 0 {
29+
return false
30+
}
31+
32+
cols := len(matrix[0])
33+
34+
return binSearch(matrix, target, 0, rows*cols-1, rows, cols)
35+
}
36+
37+
func test1() {
38+
matrix := [][]int{
39+
[]int{1, 3, 5, 7},
40+
[]int{10, 11, 16, 20},
41+
[]int{23, 30, 34, 50},
42+
}
43+
44+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 3))
45+
}
46+
47+
func test2() {
48+
matrix := [][]int{
49+
[]int{1, 3, 5, 7},
50+
[]int{10, 11, 16, 20},
51+
[]int{23, 30, 34, 50},
52+
}
53+
54+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 13))
55+
}
56+
57+
func test3() {
58+
matrix := [][]int{
59+
[]int{1, 3, 5, 7},
60+
}
61+
62+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 5))
63+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 7))
64+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 42))
65+
}
66+
67+
func test4() {
68+
matrix := [][]int{
69+
[]int{1},
70+
}
71+
72+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 3))
73+
fmt.Printf("ans: %v\n", searchMatrix(matrix, 1))
74+
}
75+
76+
func main() {
77+
test1()
78+
test2()
79+
test3()
80+
test4()
81+
}

set-matrix-zeroes.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func setZeroes(matrix [][]int) {
6+
zeroFirstCol := false
7+
m := len(matrix)
8+
9+
if m == 0 {
10+
return
11+
}
12+
13+
n := len(matrix[0])
14+
15+
for i := 0; i < m; i++ {
16+
for j := 0; j < n; j++ {
17+
if matrix[i][j] == 0 {
18+
if j == 0 {
19+
zeroFirstCol = true
20+
21+
continue
22+
} else {
23+
matrix[i][0] = 0
24+
matrix[0][j] = 0
25+
}
26+
}
27+
}
28+
}
29+
30+
// fmt.Printf("intermed: %v\n", matrix)
31+
32+
for i := 1; i < m; i++ {
33+
for j := 1; j < n; j++ {
34+
if matrix[i][0] == 0 || matrix[0][j] == 0 {
35+
matrix[i][j] = 0
36+
}
37+
}
38+
}
39+
40+
if matrix[0][0] == 0 {
41+
for j := 0; j < n; j++ {
42+
matrix[0][j] = 0
43+
}
44+
}
45+
46+
if zeroFirstCol {
47+
for i := 0; i < m; i++ {
48+
matrix[i][0] = 0
49+
}
50+
}
51+
52+
}
53+
54+
func test1() {
55+
matrix := [][]int{
56+
[]int{1, 1, 1},
57+
[]int{1, 0, 1},
58+
[]int{1, 1, 1},
59+
}
60+
61+
setZeroes(matrix)
62+
63+
fmt.Printf("ans: %v\n", matrix)
64+
}
65+
66+
func test2() {
67+
matrix := [][]int{
68+
[]int{0, 1, 2, 0},
69+
[]int{3, 4, 5, 2},
70+
[]int{1, 3, 1, 5},
71+
}
72+
73+
setZeroes(matrix)
74+
75+
fmt.Printf("ans: %v\n", matrix)
76+
}
77+
78+
func main() {
79+
test1()
80+
test2()
81+
}

0 commit comments

Comments
 (0)