c 實現陣列小和

2021-09-19 23:43:52 字數 2456 閱讀 8114

陣列小和的定義如下:

例如,陣列s=[1,3,5,2,4,6],在s[0]的左邊小於或等於s[0]的數的和為0,在s[1]的左邊小於或等於s[1]的數的和為1,在s[2]的左邊小於或等於s[2]的數的和為1+3=4,在s[3]的左邊小於或等於s[3]的數的和為1,在s[4]的左邊小於或等於s[4]的數的和為1+3+2=6,在s[5]的左邊小於或等於s[5]的數的和為1+3+5+2+4=15,所以s的小和為0+1+4+1+6+15=27。

給定乙個陣列s,實現函式返回s的小和。

input:[1

,3,5

,2,4

,6]output:

27

最簡單的就是遍歷,時間複雜度為o(n

2)o(n^2)

o(n2

)。這裡我們如果想要減少複雜度,比如達到o(n

∗log

2n)o(n * log_n)

o(n∗lo

g2​n

)。我們要轉變思想把當前數前面比她小的和轉變為當前數要被加幾次(就是跟後面數做比較,後面數比當前數大,就要加一次),可以先分成兩半,求每一半的小和,然後在將其合併,在更大的範圍內求小和,這個正符合歸併排序,只是在歸併排序的基礎上簡單的進行修改。每次比較,我們需要改進的是在比較是若後面數比當前數大,res就加當前數,只需加一句:res += vec[p1] < vec[p2] ? (r - p2 + 1) * vec[p1] : 0;下面我們還是看**:

c++解法:

剛開始按照歸併排序進行修改,一直沒有得到正確的結果,於是想起了在codeblocks進行debug, 果然解決了問題的癥結所在。

陣列小和

codeblocks斷點除錯

c 小根堆陣列實現

主要功能 最小堆排序 大到小 void order 刪除首元素 type fetch root 插入元素 void insert item const type item void insert item faster const type item 快速版本 關鍵 source code file...

小根堆 陣列實現

特點 父節點永遠比孩子節點小,不強制要求左孩子比右孩子小,但是為了實現方便,我令其左孩子比右孩子小。反之為大根堆。push 插入元素 陣列長度增加 注意 增加的不是本次插入所需要的位置,而是下次元素的位置,這句話能解釋為什麼pop的時候需要 se才能拿到當前堆中的最後乙個元素 從下往上判斷是否滿足小...

c語言 陣列小練習

解題思路 1.對於sizeof 1.陣列名單獨放在sizeof 內部,陣列名表示整個陣列,sizeof 陣列名 計算的是整個陣列的大小,單位是位元組。2.陣列名,陣列名表示整個陣列,陣列名,取出的是整個陣列的位址。3.除此之外所有的陣列名都表示整個首元素位址。2.對於strlen 它尋找的是 0 有...