1. 程式人生 > >幾個精妙的小問題(By Divide and Conquer)

幾個精妙的小問題(By Divide and Conquer)

所謂分治法就是分而治之的意思,即將一個不易解決的大問題分解為幾個易於解決的小問題,然後再將各個小問題的解合併起來就是大問題的解。這種方法雖然簡單,但是對於很多問題都很有效,下面試舉幾例:

問題一:有效字串個數問題

能在通道上傳遞的字串滿足如下兩條性質:該字串中只包含'a'、'b'、'c'三種字元;如果"aa"存在該字串中,則該字串無法傳遞,視為無效。例如:長度為2的有效字串有8個:"ab"、"ac"、"ba"、"bb"、"bc"、"ca"、"cc"、"cb"。現在要你求出長度為n的有效字串有多少個?

    提示:f(n)=2f(n-1)+2f(n-2), n>2; f(1)=3;f(2)=8

問題二:計算一個序列中倒置的個數

先來介紹一下倒置的概念:對一個序列a1,a2,a3,...,an來說,倒置為:i<j,ai>aj。現在要求在儘量短的時間下求出一個n個元素的序列中有多少倒置?

    提示:可以在O(nlgn)時間複雜度下實現。

問題三:找兩個數

A和B是兩個分別含有n個正整數的序列。對一個給定的正整數x,設計一個複雜度儘量低的演算法找出是否存在x=a+b,其中a∈A,b∈B?

    提示:可以在O(nlgn)時間複雜度下實現。