這是乙個型別題,在leetcode中很常見。這裡只是闡述下思想。
暴力解法一般是o(n2),如果觀察其他大佬的**,發現都使用了個異曲同工的解法。
使用乙個累積運算的變數s,這個變數累積的運算有具體題來決定。
先建立乙個map,一般來說選擇unorder_map,這樣查詢某個元素的複雜度是0(1),(因為這個演算法大部分時間是查詢操作)
那麼遍歷一遍陣列,每一次迴圈要做的事情:
對s進行一次運算
使用運算結果在map中查詢對應元素,並+給結果變數
將map中相應元素++
演算法思想:
對於某種運算(如加法)
當s的值再次出現時,說明這之間的所有值(包括末項,不包括首項)的和為0。
也可以說
當s的值出現時,說明從s==n的元素到當前的元素,中間數字(包括末項,不包括首項)的和為s-n。
對其他運算也可以使用相似的思想。
最後,給乙個例子:
leetcode 566題
給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。
#include
#include
#include
using namespace std;
intsubarraysum
(vector<
int>
&nums,
int k)
return ans;
}int
main()
;subarraysum
(a,3);
return0;
}
判斷乙個陣列中的數字是否連續
問題描述 乙個陣列中若干個非負整數是否連續,其中0可以代表任何數字 input 1 3 5 0 0 0 6 7 output this array is continue 演算法實現 include using namespace std void sort int a,int m bool fun...
求乙個數字陣列裡的最大連續數字的個數
問題 求乙個數字陣列裡的最大連續數字的個數。比如 3,4,4,4,2,2,3,4 return 3。此題為google的面試題。分析 設定兩個變數 全域性最大連續數字個數 maxsucc 以及區域性連續數字個數 temp。從第二個數字開始,如果當前數字比前乙個數字大1,則 temp 遇到不滿足條件的...
乙個陣列中有乙個數字的次數超過了陣列的一半
問題描述 乙個陣列中有乙個數字的次數超過了陣列的一半,求出這個字元。如 int a 求出超過一半的數字是2。問題分析 方法1 時間複雜度o n 思路 如果乙個數出現的次數超過陣列一半的長度,那麼就是說出現的次數比其他所有數字出現的次數還要多。因此我們可以考慮儲存2個值,乙個是陣列中的乙個數,乙個是數...