微軟面試百題003(歸併排序 動態規劃)

2021-07-16 07:30:47 字數 1110 閱讀 7295

請在o(n)時間複雜度之內求出陣列的子陣列最大和

在這裡我們詳細來講解兩種思路:

o(n*logn):分治法:歸併排序  

本博主的歸併排序求最大子陣列的詳解

o(n) 動態規劃

我們這裡採用動態規劃的思路來解釋一下,動態規劃的核心在於縮小問題的規模

我們這裡需要先作如下幾個準備操作;

1.定義狀態

2.定義狀態轉移方程

狀態:我們設dp,定義狀態,dp[i]的含義是i之前(必須包含data[i]這個元素)的元素中的最大的和,當我們遍歷完整個陣列之後自然就求出了整個陣列中的最大子陣列的和,我們額外用max來記錄一下目前為止的所有的最大和就可以了

狀態轉移方程:

如果當前和為負數,那麼就放棄前面的累加和,從陣列中的下乙個數再開始計數

如果一旦出現sum<0(sum是前面的和)說明下一次他一定會拖累我們的最大值的出現,所以說還不如不要,直接將sum重置為0,重新以data[i]開始

dp[i]=max(data[i],sum+data[i])

#include"iostream"

#include"cstring"

#include"cstdio"

#include"cstdlib"

#define n 100

using namespace std;

templateclass smax;

templateistream& operator>>(istream&,smax&);

templateclass smax

friend istream& operator>><>(istream&,smax&);

t returnans();

private:

t data[n];

t ans;

int num;

};templateistream& operator>>(istream& in,smax& k)

templatet smax::returnans()

return ans;

}int main()

{ smaxmy;

cin>>my;

cout<

每日一題 歸併排序

第一次寫部落格,大佬們輕點噴 注 作為乙個計算機專業的本科生,每日做題也都是必不可少的,這個系列裡會更新一些我平時做的一些題目,大都比較簡單,不少題目在其他部落格裡也可以找到,我撰寫這些部落格僅用於記錄。這是一道比較簡單的資料結構的題目,先來看題 本題要求實現二路歸併排序中的歸併操作,待排序列的長度...

每日一題 歸併排序

作為乙個計算機專業的本科生,每日做題也都是必不可少的,這個系列裡會更新一些我平時做的一些題目,大都比較簡單,不少題目在其他部落格裡也可以找到,我撰寫這些部落格僅用於記錄。這是一道比較簡單的資料結構的題目,先來看題 本題要求實現二路歸併排序中的歸併操作,待排序列的長度1 n 1000。void mer...

每日一題 92 歸併排序

題目來自網路 題目 1 基於陣列的歸併排序 題目 2 基於鍊錶的歸併排序 題目 1 基於陣列的歸併排序 思路 借助分治的思想,總是先對待排序進行分割,之後再對兩個子串行進行合併,生成乙個有序序列。時間複雜度為o nlogn 空間複雜度為o n void merge int narr,int nsta...