差分法介紹

2022-04-28 23:18:25 字數 3367 閱讀 3136

我們計畫在多個電商平台銷售某件商品,給出n個不同的電商平台的該商品的售價區間,請給出該商品在所有電商平台的售價總和最高的最低商品定價。有如下示例,我們有3個平台的售價區間prices = ,,},可以將商品定價在9元,商品總售價是9 * 3 = 27元,如下圖所示

題目的意思是先保證總售價最高,在這個前提下使得商品的單價最低,比較直觀的思路,建立乙個hash表,unordered_mapprice,表示某個price的平台數目,比如示例中price[7] = 1, price[8] = 2, price[9] = 3, price[10] = 1,然後將hash表中的鍵和值相乘,求最大值,如果有多個值相同,取鍵比較小的那個。本題目的難點在於如何以比較低的複雜度建立hash表,常規思路是\(o(n^2)\),可以參考下面的題目。

先看這道題,1109. 航班預訂統計,有n個航班,它們分別從 1 到 n 進行編號。我們這兒有乙份航班預訂表,表中第i條預訂記錄bookings[i] = [i, j, k]意味著我們在從ij的每個航班上預訂了k個座位。請你返回乙個長度為 n 的陣列answer,按航班編號順序返回每個航班上預訂的座位數。參考示例如下,

輸入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5

輸出:[10,55,45,25,25]

將這道題的示例畫一張**表示一下,就是下面的結果

booking12

3451

101000

02020

20003

0252525

25total

1055

4525

25常規思路就是以航班號為基本座標,計算每乙個航班增加的座位數,然後逐項彙總相加即可。

設定初始結果vectorres(n, 0);

遍歷bookings,每次取其中的航班的預定數,新增到res對應的陣列中,比如第1個booking,那麼res[0]+=10; res[1]+=10,依次類推,直到遍歷截止。

上面的演算法比較簡單直觀,但是可以分析發現,演算法的複雜度有點高,兩層遍歷演算法時間複雜度是\(o(n^2)\),空間複雜度是\(o(n)\)不甚理想。

有沒有複雜度更簡單的思路呢?這裡有乙個模擬公交站的思路,可以將航班號碼比作公交站牌,比如1號公交站,2號公交站,假定這些公交站是依次按順序分布在一條直線公路上,i個航班的飛機的預定數目就是公交車在第i個公交站發車時候的乘客數目(包括了上車和下車的乘客數)。

舉例說明,第1行表示,第1站交車上人數是10,說明公交車行駛到第1站時上車10人,到第2站時候車上的乘客仍然是10人,說明沒有乘客上下車,到第3站時候車上乘客0人,說明此時有10人下車。如果使用長度為n的陣列count表示每一站上下乘客的變化量(count[i]表示第i + 1站上下車的乘客變化量),

對於booking = [i,j,k]

表示在公交站第i站上車k人,count[i - 1] += k

i + 1站直到第j站都沒有乘客上下車,count[i],...,count[j - 1]無操作;

在第j + 1站下車k人,所以count[j] -= k

為了方便起見,我們縮小問題的規模,以具體的數字代替抽象的代數字母,假如我們就只有3個公交站,取示例中的前2行,

公交車剛開始上的人數是0,vectorcount(4, 0)

讀取第1行,到達第1站,公交車上10人,說明上車10人,無人下車,count[0]+= 10,到達第2站公交車上依然是10人,說明也無人上車和下車,到達第3站,公交車上0人,說明10人下車,count[2] -= 10

讀取第2行,公交車到達第2站,公交車上20人,說明上車20人無人下車,count[1] += 20,第3站車上20人,說明無人下車,第4站車上0人,說明有20人下車,count[3]-=20

遍歷結束,得到count =,那麼最後每個站點的乘客數就很清楚了,到達第1站前車上乘客0人,到達後上車10人,所以第1站發車前車上10人,第2站到站後上車20人,所以第2站發車前車上乘客10 + 20 = 30人,第3站到站後下車10人,所以發車前車上乘客 30 - 10 = 20人。意思搞清楚之後,**就很好寫了。

vectorcorpflightbookings(vector>& bookings, int n) 

res[0] = counter[0];

for (int i = 1; i < n; i++)

return res;

}

時間複雜度為\(o(n)\)。

借鑑參考題的**,原題的**如下

int getbestprice(vector>& prices) 

for (int i = minval; i < maxval + 1; i++)

// counter[0]代表第minval站,注意此處的對應關係

int len = maxval - minval + 1;

vectorcounter(len + 1, 0);

for (auto& price : prices)

pricetable[minval] = counter[0];

int bestprice = minval;

maxval = minval * pricetable[minval];

for (int i = 1; i < len; i++)

}return bestprice;

}

幀間差分法

幀間差分法 幀間差分法是常見的目標識別演算法,這裡是matlab簡單實現 l bwlabel bw1 預設8連通 bwlabe bw,4 stats regionprops l,all stats中含有所有連通域的properations 在bw影象上繪製出連通域的矩形框 figure imshow...

差分法 (分數比較)

在滿足 適用形式 的兩個分數中,我們定義分子與分母都比較大的分數叫 大分數 分子與分母都比較小的分數叫 小分數 而這兩個分數的分子 分母分別做差得到的新的分數我們定義為 差分數 例如 324 53.1與313 51.7比較大小,其中324 53.1就是 大分數 313 51.7就是 小分數 而324...

有限差分法MATLAB程式

設有乙個長直接地金屬矩形槽,長a 40,寬b 20,其側壁與底面電位均為零,頂蓋電位為100v 相對值 求槽內電位分布。利用高斯迭代求解 如下 相鄰兩次迭代值最大允許誤差為0.001 a zeros 21,41 a 1,100 b zeros 19,39 c eye 19,39 count 1 d ...