給定乙個整數陣列 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...