Maximum Differences
Maximum value of a[j] > a[i] such that j>i
Input: arr[] = {3, 4, 11, 7, 5, 9, 1}
Outout: 8
Input: arr[] = {8, 10, 6, 7, 4, 2}
Outout: 2
Input: arr[] = {20, 30, 40}
Output: 20
Here array is sorted so max diff is last element minus first element.
Input: arr[] = {40, 30, 6, 4}
Output: -2
Here array is reverse sorted then output will be negative
Naive Approach
package main
import (
"fmt"
)
func main() {
arr := []int{3, 4, 11, 7, 5, 9, 1} // 8
// arr := []int{8, 10, 6, 7, 4, 2} // 2
// arr := []int{20, 30, 40} // 20
// arr := []int{40, 30, 6, 4} // -2
result := maxDiff(arr)
fmt.Println(result)
}
func maxDiff(arr []int) int {
result := arr[1] - arr[0]
for i := 0; i < len(arr); i++ {
for j := i + 1; j < len(arr); j++ {
result = max(result, arr[j]-arr[i])
}
}
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
Time complexity: θ(n2)
Efficient Approach
package main
import (
"fmt"
)
func main() {
arr := []int{3, 4, 11, 7, 5, 9, 1} // 8
// arr := []int{8, 10, 6, 7, 4, 2} // 2
// arr := []int{20, 30, 40} // 20
// arr := []int{40, 30, 6, 4} // -2
result := maxDiff(arr)
fmt.Println(result)
}
func maxDiff(arr []int) int {
result := arr[1] - arr[0]
minVal := arr[0]
for i := 1; i < len(arr); i++ {
result = max(result, arr[i]-minVal)
minVal = min(minVal, arr[i])
}
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
Time Complexity: θ(n)
Aux Space: θ(1)