之前研究演算法,還剩下三大難題——kmp,rb-tree和dp。。
本來是想把dp這一遺留問題解決,就看到了這個問題,後面才發現這個問題其實很簡單,完全用不到動態規劃的思想,或者是最簡單的一維dp。
問題描述,
乙個陣列,n個元素,有正有負
求最大子陣列,要求o(n)複雜度
例如,輸入陣列為 1,-2,3,10,-4,7,2,-5 則和最大的子陣列為3,10,-4,7,2
解決方案
對陣列進行一次遍歷,在遍歷的過程中記錄一些資訊,並不斷的更新這一資訊。包括
目前最大子陣列的起始位置,結束位置,子陣列和
當前正在遍歷的子陣列起始位置,當前位置,當前的和。。
若遍歷到陣列的某一元素,當前和為負,則丟棄當前子陣列,從下乙個元素開始重新計算
若當前遍歷元素<0,則嘗試比較當前子陣列與歷史最大子陣列,決定是否進行更新
在陣列遍歷結束後,比較當前子陣列與歷史最大子陣列,決定最後的結果輸出。
核心**如下,
int max_sub_array(int a,int n,int &left,int &right,int &max)//初始時,left=right=max=0
int cur_left = -1;
int cur_right = cur_max =0;
int index;
for(index =0;index
if(cur_max > max)}
cur_right = index;
cur_max +=a[index];
}上面這些**的邏輯有點問題。。
正確的**如下,
int max_sub_array(int a,int n,int &left,int &right,int &max)
cur_right = index;
cur_max += a[index];
if(cur_max <0)
continue;
}cur_right = index;
cur_max += a[index];
}if(cur_max > max)
}
演算法之求最大子陣列
最大子陣列問題暴力求解演算法複雜度2 n 兩種高效方法求最大字陣列問題 問題 求乙個陣列中相加可以獲得最大值的子陣列,子陣列是指原陣列中任意連續的一段 1.遞迴與分治法 複雜度nlogn include using namespace std int max mid int a,int mid,in...
迴圈陣列求最大子陣列
題目 返回乙個整數陣列中最大子陣列的和。要求 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。如果陣列a 0 a j 1 首尾相鄰,允許a i 1 a n 1 a 0 a j 1 之和最大。同時返回最大子陣列的位置。求所有子陣列的和的最大值。要...
求最大子陣列之和
在乙個有n個元素的陣列中,其中每個元素的值可正可負,在該陣列中求乙個連續子陣列,使得該陣列的和最大 拿到這個題首先想到的是暴力法,即暴力迴圈求所有陣列的和,因此可以求的該陣列的最大值,其時間複雜度為o n 3 時間複雜度較高,我們可以用分治法和動態規劃來做這道題。其中分治法時間複雜度為o n log...