待字閨中之相伴一生分析

2021-06-22 19:01:22 字數 1278 閱讀 9663

題目**,

原題

給定乙個陣列,陣列中只包含0和1。請找到乙個最長的子串行,其中0和1的數量是相同的。

例1:10101010 結果就是其本身。

例2:1101000 結果是110100

請大家展開自己的思路。

分析

這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。但,找狀態轉移方程,我們要對原來的陣列進行變換一下。

原來是0和1的串,我們將0都換為-1。這樣題目目標就變成,找到乙個最長的子串,子串數字和是0。設原陣列為a, dp[i]表示從0開始到i的子陣列和。dp遍歷一遍陣列即可。例1中的陣列產生的dp為:01

2345

6710

1010

10這個例子,最後乙個值是0,並且長度是偶數字。直接滿足了結果。

再看例子2:01

2345

6121

210-1

5的位置為0,最長子串從0開始到5,長度為6。

上面這兩個例子,所求的子串都是從頭開始,如果不是從頭開始,會是什麼樣的呢?看這個例子:110110001

2345

6121

2321

通過觀察上面的**,我們可以得到,dp[0]==dp[6]==dp[2],dp[1]==dp[3]. 根據dp的定義,如果dp[i]==dp[j],i 一種方法,我們用map儲存dp的值到位置的對映,如下表:

dp值位置

最大位置

最小位置

最大長度

10,2,660

621,3312

3444

0最長子串長度6

我們最終的演算法,要綜合考慮最長串是否從頭開始的。 上面的這個思路,時間複雜度是o(n),空間複雜度也是o(n).具體**如下:

struct node//儲存hash表中的最大最小位置

};void insetintohashmap(map& hashmap,int key,int index)//把」和「及位置插入hash表中

else//修改該和的最大最小位置 }

vectorlongsubseq(vector& data)

} res.push_back(begin);//儲存開始和結束的位置

res.push_back(end);

return res;

}

如有問題,請指正,謝謝

待字閨中之巧妙排序分析

排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。分析 這個題目,儘管也是排序,但卻不能使用快速排序的方法。只有三個元素,如果時間複雜度仍舊是o nlogn 顯然不是最好的。那就可以使用線性的排序演算法,例如計數排序,可是題目中要求,不能夠對1,2,3進行統計個數。那該如何處理呢?請大家看...

待字閨中之巧妙排序分析

排序僅僅有1。2,3三個元素的陣列。不能統計1,2。3的個數。分析 這個題目,雖然也是排序,但卻不能使用高速排序的方法。僅僅有三個元素,假設時間複雜度仍舊是o nlogn 顯然不是最好的。那就行使用線性的排序演算法,比如計數排序。但是題目中要求,不可以對1,2,3進行統計個數。那該怎樣處理呢?請大家...

待字閨中之兄弟數字分析

給定乙個數x,他的兄弟數y定義為 是由x中的數字組合而成。而且y是大於x的數中最小的。比如,38276的兄弟數字為38627。給定x,求y。分析 這個題目當然有暴力的方法。列出全部的排列組合。然後然後找到大於x中,最小的y。即。找到兄弟數字。那有沒有更好的方法呢?不想對全部情況進行窮舉。就要想辦法,...