LeetCode 891 子串行寬度之和

2021-08-29 00:00:23 字數 1100 閱讀 6384

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

首先將陣列排序( a 中共有 n 個元素),單獨分析乙個元素 a[i],求該元素在所有子集中,幾次作為最大值出現,幾次作為最小值出現。任一子集均存在乙個最大值和乙個最小值,所以所有的 a[i] * 最大值之和,減去所有的 a[i] * 最小值之和即為所求。

元素 a[i] 被作為最大值的次數:比 a[i] 小的元素有 i 個,這 i 個元素能形成的子集數目為 2^i(這其中包括乙個空集),將這些集合全部加上乙個 a[i],則這些集合中 a[i] 為最大元素;

元素 a[i] 被作為最大值的次數:比 a[i] 大的元素有 n-i-1 個,這 i 個元素能形成的子集數目為 2^(n-i-1)(這其中包括乙個空集),將這些集合全部加上乙個 a[i],則這些集合中 a[i] 為最小元素;

對 i 從 0~n,所有 a[i] * ( 2^i - 2^(n-i-1) ) 之和為題目所求。

注意:int 是 short int 的省略,佔記憶體的 2 個位元組,表示範圍為 - 32768 ~ 32767。long 是 long int 的省略,佔記憶體的 4 個位元組,表示範圍為 - 2147483648 ~ 2147483647,此處也可以用 long long int。

class solution

long res = 0;

for (int i=0; i

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

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

leetcode 判斷子串行

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

leetcode 判斷子串行

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