天天看點

算法筆試模拟題精解之“奇偶數列”

【線上程式設計産品介紹】

阿裡雲開發者社群線上程式設計:

免費刷題大神器,助你拿到好offer

周賽月賽不停歇,做題還能領獎品

大賽筆試全真題,常做常新有驚喜

點選連結開始産品體驗:

https://developer.aliyun.com/coding 本文為大家介紹的是“136.奇偶數列”的解法探究。先來看一下題目内容:

題目詳情

等級:中等

知識點:DP

檢視題目:136.奇偶數列

Tom有一個長度為n(1<=n<=100)的數列,數列中隻包含1-n且不重複的數字。

這個數列是一個不完整的數列,意思是說數列中有幾個位置是空的,Tom想讓你幫他把空的位置填上數字,當然是有要求的,對于一個數列來說,如果相鄰兩位的數字奇偶性不同,這個數列的權值就+1,請你算出來将空位補上以後,權值最小為多少?對于這個數列,空位用0表示。

輸入數列長度n(1<=n<=100)和n個數ai(0<=ai<=n)

輸出填上空位以後的數列的最小權值。

示例1

輸入:

5

[0,5,0,2,3]

輸出:

2

注意:

對于樣例解釋說明,符合題意的數列可以為1 5 4 2 3

解題思路一:貪心算法

對于這道題來說,隻需要考慮是奇數還是偶數,而不用理會具體的值。

下面用0代表偶數,1代表奇數,-1表示空位。

這道題對應的空位隻有下面5種情況(連續空位的不同個數沒有影響):

1、空位在左右兩側(以左側舉例)-10也就是最邊上是連續的空位,然後接一個偶數;

2、空位在左右兩側(以左側舉例)-11也就是最邊上是連續的空位,然後接一個奇數;

3、空位在中間,兩側都是奇數1-11;

4、空位在中間,兩側都是偶數0-10;

5、空位在中間,兩側一奇一偶0-11。

計算在5種情況下對應最少可能增加的權值

1、可能增加0(填偶數)或1(偶數不夠,要填奇數)

2、可能增加0或1與上面對應

3、可能0(填奇數)或2(奇數不夠填偶數)

4、可能0或2與上面對應

5、隻能為1

給5種空位重要性排序(确定貪心政策)

第5種,因為不管填什麼都增加1,是以排在最後

第3,4種,因為填錯了會增加2,比一二種多,是以排第一(相同情況按照空位個數排序,越少越靠前)

第1,2種,排在3,4後面。

計算過程

1、周遊一次,從原數組中提取出這5種空位,同時計算沒有填入的奇數偶數分别為多少個

2、按照(3,4)(1,2)(5)分成三組,對前兩組按照空位從少到多排序

3、按照貪心政策的順序

先判斷(3,4)中有多少可以增加0的,并消耗掉對應的奇數偶數個數,增加為2的直接跳過,不消耗個數。

然後判斷(1,2)中有多少可以增加0的,并消耗掉對應的奇數偶數個數,增加為1的直接跳過,不消耗個數。

最後計算(3,4)剩下的個數

*

2+(1,2)中剩下的個數

*

1+(5)中剩下的個數

*

1

解題思路二:動态規劃

樣例是0 5 0 2 3,那麼兩個空位隻能填1或者4,是以有1 5 4 2 3和4 5 1 2 3兩種情況。

由于前者的權值要小于後者的權值,是以1 5 4 2 3是最優解,如果我們考慮貪心的做法會有很多的情況要讨論,而且也避免不了一些沖突。

我們可以将問題抽象一下,其實就是求對于目前這一個位置之前有多少個奇偶對,可以進一步轉換成求前一位的奇偶性,不妨考慮動态規劃。

我們設dpi[k],其中i表示目前所在第i位,j表示前i位一共有j個奇數(那麼就有i-j個偶數),k隻能為0或1,當k為0表示第i位放0,k為1表示第i位放1,然後我們同時更新第i位放0和放1的情況的最小值。

那麼對于目前的位來說如果填偶數就有dpi[0] = min(dpi-1[0], dpi-1[1] + 1),如果填奇數就有dpi[1] = min(dpi-1[0] + 1, dpi-1[1]),最終的狀态就是min(dpn[1], dpn[0])。

算法筆試模拟題精解之“奇偶數列”

時間複雜度:O(2n^2)

空間複雜度:2n^2+n

看完之後是不是有了答題思路了呢,快來練練手吧:

136.奇偶數列
算法筆試模拟題精解之“奇偶數列”

繼續閱讀