-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfindMaxSubarray.go
More file actions
74 lines (67 loc) · 1.99 KB
/
findMaxSubarray.go
File metadata and controls
74 lines (67 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package searching
import "math"
type SubArray struct {
Array []int // Parent array
Start int // start of subarray
End int // end of subarray
Sum int // Sum of subarray elements
}
func NewSubArray(array []int, start int, end int) *SubArray {
return &SubArray{Array: array, Start: start, End: end, Sum: math.MinInt32}
}
// FindMaxSubArray : Return the Subarray from the given array, where sum of
// the subarray members is maximum. Minimum SumArray size is 2 elements
// If single element array is given as input, sum will be the element value itself.
func FindMaxSubArray(array []int) SubArray {
if len(array) <= 1 {
result := *NewSubArray(array,0, len(array))
if len(array) == 1 {
result.Sum = array[0]
}
return result
} else {
return findMaxSubArray(*NewSubArray(array, 0, len(array)))
}
}
func findMaxSubArray(inArray SubArray) SubArray {
if inArray.End == inArray.Start{//inArray.Sum = inArray.Array[inArray.Start]
return inArray
} else {
mid := (inArray.Start+inArray.End) / 2
leftSubArray := findMaxSubArray(*NewSubArray(inArray.Array,inArray.Start, mid))
rightSubArray := findMaxSubArray(*NewSubArray(inArray.Array,mid+1, inArray.End))
crossSubArray := findMaxCrossingSubArray(inArray, mid)
if leftSubArray.Sum >= rightSubArray.Sum && leftSubArray.Sum >= crossSubArray.Sum{
return leftSubArray
}else if rightSubArray.Sum >= leftSubArray.Sum && rightSubArray.Sum >= crossSubArray.Sum {
return rightSubArray
} else {
return crossSubArray
}
}
}
func findMaxCrossingSubArray(array SubArray, mid int) SubArray {
leftSum := math.MinInt32
sum := 0
maxStart := mid
maxEnd := mid
for i:=mid; i >= array.Start; i-- {
sum = sum + array.Array[i]
if sum > leftSum {
leftSum = sum
maxStart = i
}
}
rightSum := math.MinInt32
sum = 0
for i := mid + 1; i < array.End; i++ {
sum = sum + array.Array[i]
if sum > rightSum {
rightSum = sum
maxEnd = i
}
}
result := *NewSubArray(array.Array, maxStart, maxEnd)
result.Sum = leftSum+rightSum
return result
}