1. 程式人生 > >golang 最大子陣列問題

golang 最大子陣列問題

所謂最大子陣列就是連續的若干陣列元素,如果其和是最大的,那麼這個子陣列就稱為該陣列的最大子陣列。最大子陣列是很多問題的抽象,比如購買股票。如果把相鄰兩天的股價之差作為陣列元素,那麼求在連續的某個時間段內買入股票的最佳時間和賣出股票的最佳時間就可以抽象為計算最大子陣列的問題。

時間複雜度為 n 的解法如下:

package main

import (
	"fmt"
	"math"
)

// 查詢數組裡最大的數
func findMax(arr []int) (max, index int) {
	max = math.MinInt32
	index = -1
	for i, v := range arr {
		if v > max {
			max = v
			index = i
		}
	}
	return
}

func MaxSubArray(arr []int) (maxSum int, subArr []int) {
	// 判空檢查
	if len(arr) == 0 {
		return
	}
	// 按包含正數方式求最大子陣列
	maxSum, begin, end, sum := 0, 0, 0, 0
	for i, v := range arr {
		sum += v
		if sum <= 0 {
			sum = 0
			begin = i + 1
		}
		if sum > maxSum {
			maxSum = sum
			end = i
		}
	}
	// 如果全為非正數時,返回最大的數
	if maxSum == 0 {
		max, index := findMax(arr)
		maxSum = max
		begin = index
		end = index
	}
	return maxSum, arr[begin : end+1]
}

func main() {
	arr := []int{13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}
	maxSum, subArr := MaxSubArray(arr)
	fmt.Println(maxSum)
	fmt.Println(subArr)
}