差分,也就是數與數之間的差值。拿一維差分來舉例子,將差分設為c[ ]陣列,原數為a[ ],那麼
$c[i]=a[i]-a[i-1]$
這便是簡單的差分陣列;
那麼要他何用?
最為主要的作用就是區間的修改,那麼在修改之前,我們先明白如何將原數求出。很顯然,c[1]~c[i]差分陣列求和即可得到a[i]。
那區間修改呢?
如我們將從l到r的區間加上s(減去也一樣),那麼由差分陣列的定義得,觀察陣列,發現只有c[l]和c[r+1]變化了。
具體證明可以手動模擬,而中間的不變是因為i項與i-1項都加上了s,差值不變;
那麼這樣就能得到
$a[l]~a[r]+=s-->c[l]+s,c[r+1]+s$
這樣就實現了o(1)修改;
當然還有區間求和,這裡給出證明
這樣我們可以發現乙個規律,即第二個多項式的係數為i-1
那麼我們用c2[ ]來維護這個陣列,那麼
c2[i]=(i-1)*c[i];
並且在修改時維護c2[ ]陣列,即
$c[l]+(l-1)*s,c[r+1]-(r+1-1)*s$
之後便有了公式
這裡便是一維差分
二維差分的推導
這裡的推導只是單純的根據一維差分和二維字首和的性質來推的
二維字首和請務必提前了解,並有一定的認識;
那麼開始推導;
根據二維字首和表示的是右上角矩形的和,由於差分只涉及前面相鄰的數(由一維可以推出),並且由前面範圍的數相加得到這個位置的數;
那麼模擬二維字首和和一維差分,可以簡單推測出二維差分的公式
$c[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]$
是不是覺得非常眼熟?
我們再代入檢驗,即將左上角的矩陣差分求和,正好得到了這個數·
這還並不能代表什麼,重要的是區間的修改;
同樣,我們將要修改的矩陣的右上角設為(x1,y1),右下角設為(x2,y2)
我們發現有影響的只有我所標註的點,除了(x2,y2),這個應該很好看出;
那麼,我們就得到公式
$c[x1][y1]+=s,c[x1][y2+1]-=s,c[x2+1][y1]-=s,c[x2+1][y2+1]+=s$
推薦自己再推一遍。
之後求數只需累加即可。
一維差分與二維差分
自 leetcode周賽第四題需要用到二維差分,所以就找了篇文章,便於檢視b i a i a i 1 稱b陣列是a陣列的差分陣列。舉個栗子 a 0,1 2,3 4,5 b 0,1,1,1,1,1 為啥呢?a 5 a 4 b 5 a 4 a 3 b 4 a 3 a 2 b 3 a 2 a 1 b 2 ...
差分矩陣 二維差分
輸入乙個n行m列的整數矩陣,再輸入q個操作,每個操作包含五個整數x1,y1,x2,y2,c,其中 x1,y1 和 x2,y2 表示乙個子矩陣的左上角座標和右下角座標。每個操作都要將選中的子矩陣中的每個元素的值加上c。請你將進行完所有操作後的矩陣輸出。輸入格式 第一行包含整數n,m,q。接下來n行,每...
差分 (2)二維差分
前面部分我們介紹了一維差分,下面我們擴充套件一下,來介紹二維差分。我們有乙個矩陣,如下圖所示。根據二維字首和表示的是右上角矩形的和,由於差分只涉及前面相鄰的數 由一維可以推出 並且由前面範圍的數相加得到這個位置的數。那麼模擬二維字首和和一維差分,可以簡單推測出二維差分的公式 如何從差分矩陣得到原矩陣...