974 和可被 K 整除的子陣列

2021-10-06 13:53:21 字數 1920 閱讀 6161

給定乙個整數陣列 a,返回其中元素之和可被 k 整除的(連續、非空)子陣列的數目。

示例:

輸入:a = [4,5,0,-2,-3,1], k = 5

輸出:7

解釋:有 7 個子陣列滿足其元素之和可被 k = 5 整除:

[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

力扣上的題目,看了幾個小時看懂了。基本所有的坑都踩到了。來看看我的解題思路吧!

我們要養成這樣乙個習慣一看到「子陣列和」就要想到「字首和」

什麼是字首和?

「字首和」就是陣列第0項到當前項的總和,用乙個陣列接收。

拿示例舉例,「字首和」的第0項到第j項:

p[0]=a[0]

p[1]=a[0]+a[1]

p[i]=a[0]+a[1]+……+a[i]

p[j]=a[0]+a[1]+……+a[j]

巧妙的轉化題目,我們要知道任意的子陣列之和,也就是:

a[i]+……+a[j]=p[j]-p[i-1] (0在這裡又要引入同餘定理,也就是:

(a-b)/m為整數,則有a%m=b%m。這就是同餘嘛。

這裡(a-b)/m為整數其實就是(a-b)%m=0與上式(p[j]-p[i-1])%k=0類似。

我們把同餘定理倒著用:只要a%m=b%m,就有(a-b)%m=0。

也就是只要p[i-1]%k=p[j]%k,就有(p[j]-p[i-1])%k=0。

或者說只要p餘有同餘就有(p[j]-p[i-1])%k=0 (p餘就是p[j]%k (0這裡題目就大致清楚了。下面講的有點抽象我們結合示例看:

先將要用到的資料算出來

a = [4,5,0,-2,-3,1]

p = [4,9,9,7,4,5] (p是「字首和」)

p餘=[4,4,4,2,4,0] (p餘就是p[j]%k (0就是這裡想了半天才想明白!!!

這裡我把同餘分為一般同餘特殊同餘

一般同餘

示例中一般同余為4,且有4個。4個中每兩個可以組成可被 k 整除的(連續、非空)子陣列,這就轉化成排列組合問題。

以p[4]為p[j]有3種:

p[0]與p[4],p[1]與p[4],p[2]與p[4]

以p[2]為p[j]有2種:

p[0]與p[2],p[1]與p[2]

以p[1]為p[j]有1種:

p[0]與p[1]

抽象一下就是(同餘數-1)+(同餘數-2)+……+0

特殊同餘

也就是當p餘=0時,它自己就是可被 k 整除的(連續、非空)子陣列。

但我們不能直接加上p餘=0的個數,因為它同時還滿足一般同餘

假設:在一開始將p餘=0的個數加1

p餘=0的個數實際為1時,p餘=0的個數為2則

(同餘數-1)+(同餘數-2)+……+0=1+0=1

p餘=0的個數實際為2,p餘=0的個數為3則

(同餘數-1)+(同餘數-2)+……+0=2+1=3

p餘=0的個數實際為3,p餘=0的個數為4則

(同餘數-1)+(同餘數-2)+……+0=3+2+1=6

驗證一下確實如此。

class solution 

return ans;

}}

這道題主要考察「字首和」與「同餘定理」。

974 和可被 K 整除的子陣列

給定乙個整數陣列 a,返回其中元素之和可被 k 整除的 連續 非空 子陣列的數目。示例 輸入 a 4,5,0,2,3,1 k 5 輸出 7 解釋 有 7 個子陣列滿足其元素之和可被 k 5 整除 4,5,0,2,3,1 5 5,0 5,0,2,3 0 0,2,3 2,3 1 a.length 300...

974 和可被 K 整除的子陣列

給定乙個整數陣列 a,返回其中元素之和可被 k 整除的 連續 非空 子陣列的數目。示例 輸入 a 4,5,0,2,3,1 k 5 輸出 7 解釋 有 7 個子陣列滿足其元素之和可被 k 5 整除 4,5,0,2,3,1 5 5,0 5,0,2,3 0 0,2,3 2,3 1 a.length 300...

Leecode 974 和可被 K 整除的子陣列

給定乙個整數陣列 a,返回其中元素之和可被 k 整除的 連續 非空 子陣列的數目。示例 輸入 a 4,5,0,2,3,1 k 5 輸出 7 解釋 有 7 個子陣列滿足其元素之和可被 k 5 整除 4,5,0,2,3,1 5 5,0 5,0,2,3 0 0,2,3 2,3 public intsuba...