LeetCode 子串行寬度之和(公式遞推法)

2021-09-24 11:44:33 字數 1278 閱讀 1100

給定乙個整數陣列 a ,考慮 a 的所有非空子序列。

對於任意序列 s ,設 s 的寬度是 s 的最大元素和最小元素的差。

返回 a 的所有子串行的寬度之和。

由於答案可能非常大,請返回答案模 10^9+7。

示例:

輸入:[2,1,3]

輸出:6

解釋:子串行為 [1],[2],[3],[2,1],[2,3],[1,3],[2,1,3] 。

相應的寬度是 0,0,0,1,1,2,2 。

這些寬度之和是 6 。

1 <= a.length <= 20000

1 <= a[i] <= 20000

思路分

析:\color思路分析:

思路分析

:由題意可知子串行的寬度只與序列中的最小值、最大值有關,並且 子串行的寬度 == 兩端最值之差,「序列」和順序無關,因此為了推出數學公式,我們可以對陣列進行排序處理。

假設現在有乙個子串行a[i, i + 1, i + 2, ... j],由於進行了遞增排序,所以最小值為 a[i] 和最大值為a[j] ,如果我們把子序列中的某個元素移除(除兩端最值以外),這個子串行的寬度並不會改變。(因為子串行的寬度 == 兩端最值之差)那麼我們固定a[i],a[j]後,能夠產生多少個寬度為a[j] - a[i]的子串行呢?

由於a[i] ~ a[j]中間一共有 ((j - 1) - (i + 1)) + 1 = j - i + 1個元素,每個元素都可以選擇放入序列或者不放入序列2種情況,所以一共有 2j-i+1中情況,也就是說以a[i]、a[j]為兩端為最值的子串行一共有2j-i+1個,所有的寬度綜合為 2j-i+1 * (a[j] - a[i])。

所以整個陣列的子串行寬度總和為:

進行化簡:

現在就非常好求解了吧,只涉及到2的冪運算。

LeetCode 891 子串行寬度之和

給定乙個整數陣列a,考慮a的所有非空子序列。對於任意序列 s 設 s 的寬度是 s 的最大元素和最小元素的差。返回 a 的所有子串行的寬度之和。由於答案可能非常大,請返回答案模 10 9 7。示例 輸入 2,1,3 輸出 6 解釋 子串行為 1 2 3 2,1 2,3 1,3 2,1,3 相應的寬度...

CSS 父元素寬度自適應子元素寬度之和

直接新增 width max content 宣告就 ok,之前太單純了。最近碰見這樣乙個需求,要讓橫向排列設定 x 方向的滾動條滾動檢視,原本當直接建立乙個 ifc inline,float 什麼的 就解決了,搞了半天發現搞不定 ifc 也是不能父元素寬度自適應子元素寬度之和的,因為會換行。最後用...

leetcode 判斷子串行

給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...