小和問題 乙個好例子

2021-10-09 23:41:03 字數 1876 閱讀 3766

在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。

例子 [1,3,4,2,5]

1左邊比1小的數:沒有

3左邊比3小的數:1

4左邊比4小的數:1,3

2左邊比2小的數:1

5左邊比5小的數:1,3,4,2

所以小和為1+1+3+1+1+3+4+2=16

這個例子總是看不明白,為什麼呢?因為分治思想在這裡體現的時候,會誤導新手;這個例子很巧的,分治之後,都是左邊小於右邊的,如圖:

說巧不巧,人家就是有順序的!,左邊從小到大,右邊從小到大,都是先天的有序!1<3<4,2<5。所以為了更好的理解這個分治的思想,我們換個例子,把例子修改一下,變成這樣:

在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。

例子 [4,3,1,5,2]

4左邊比4小的數:沒有

3左邊比3小的數:沒有

1左邊比1小的數:沒有

5左邊比5小的數:4,3,1

2左邊比2小的數:1

所以小和為4+3+1+1=9

現在我們開始來用分治的思想來做這個題,就變成了這個樣子:

這個修改的例子裡面,就能體現出來,每一次的比對,結果都利用上了;4和3比較,沒有人比4小,但是我們得到了大小資訊,把順序儲存在help裡面,4,3和1比較,同樣沒有人比1小,但是,比較 的資訊我們儲存在了help裡面…

public

class

main

; system.out.

println

("sum is : "

+smallsum

(arr));

}public

static

intsmallsum

(int

arr)

return

mergesort

(arr,

0, arr.length -1)

;}public

static

intmergesort

(int

arr,

int l,

int r)

int mid = l +

((r - l)

>>1)

;return

mergesort

(arr, l, mid)

+mergesort

(arr, mid +

1, r)

+merge

(arr, l, mid, r);}

public

static

intmerge

(int

arr,

int l,

int m,

int r)

while

(p1 <= m)

while

(p2 <= r)

for(i =

0; i < help.length; i++

) system.out.

println

("help end !");

return res;

}}

結果:

文字的乙個小例子

自然語言文字預處理 導入庫 import pandas as pd import jieba 結巴分詞 from sklearn.feature extraction.text import tfidfvectorizer 基於tf idf的詞頻轉向量庫 分詞函式 def jieba cut str...

搜尋初步 乙個小例子

本篇部落格主要以乙個小例子來初步探索一下 搜尋 包括程式的邏輯結構設計 例 在美元中,硬幣是有名字的,它有一些英文單詞去對應的硬幣的面值,比如1分錢叫做penny,5分錢叫做nichel.有乙個數字對應乙個英文單詞 如果要編寫乙個程式做搜尋,使用者輸入乙個數字 面額 程式輸出對應的英文,那麼如何實現...

ViewPager的乙個小例子

早就聽說有這個viewpager控制項,專案要中使用的也多,viewpager也是更新到了viewpager2。但是我一直沒有使用過,現在記錄一下簡單的使用方法。它的使用和recycleview listview的使用大同小異。也需要介面卡和監聽事件。相信用過這些控制項的同學一定不陌生。上 acti...