leetcode 523 560 字首和技巧

2021-10-08 15:34:19 字數 3122 閱讀 2893

3、題解:leetcode523. 連續的子陣列和

字首和的思路是這樣的,對於乙個給定的陣列 nums,我們額外開闢乙個字首和陣列進行預處理。

int n = nums.

size()

;// 字首和陣列

presum[i]就是nums[0..i-1]的和。那麼如果我們想求nums[i..j]的和,只需要一步操作presum[j+1]-presum[i]即可,而不需要重新去遍歷陣列了。

原題給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。

輸入:nums = [1,1,1], k = 2

輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。

說明 :

關鍵是,如何快速得到某個子陣列的和呢,比如說給你乙個陣列nums,讓你實現乙個介面sum(i, j),這個介面要返回nums[i..j]的和,而且會被多次呼叫,你怎麼實現這個介面呢?

因為介面要被多次呼叫,顯然不能每次都去遍歷nums[i..j],有沒有一種快速的方法在o(1) 時間內算出 nums[i..j]呢?這就需要字首和技巧了。

class

solution

int ans =0;

for(

int i =

1;i <= len;i++)}

return ans;}}

;

問題:時間複雜度太高:超時

for

(int i =

1;i <= len;i++

)}

第二層 for 迴圈在幹嘛呢?

arrsum[i]

- arrsum[j]

== k

arrsum[j]

== arrsum[i]

- k

優化的思路是:

直接記錄下有幾個 sum[j]sum[i] - k 相等,直接更新結果,就避免了內層的 for 迴圈。可以用雜湊表,在記錄字首和的同時記錄該字首和出現的次數

class

solution

return ans;}}

;

比如說下面這個情況,需要字首和 8 就能找到和為 k 的子陣列了,之前的暴力解法需要遍歷陣列去數有幾個 8,而優化解法借助雜湊表可以直接得知有幾個字首和為 8。

原題鏈結

給定乙個包含 非負數 的陣列和乙個目標 整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,且總和為 k 的倍數,即總和為 n*k,其中 n 也是乙個整數。

示例 1:

輸入:[23,

2,4,

6,7]

, k =

6輸出:true

解釋:[2,

4] 是乙個大小為 2 的子陣列,並且和為 6。

示例 2:

輸入:[23,

2,6,

4,7]

, k =

6輸出:true

解釋:[23,

2,6,

4,7]是大小為 5 的子陣列,並且和為 42。

說明:陣列的長度不會超過 10

,000 。

你可以認為所有數字總和在 32 位有符號整數範圍內。

通過次數19

,987提交次數89

,540

class

solution

vector<

int>

pre_sum

(nums.

size()

+1,0

);for(

int i =

0; i

size()

;++i)

for(

int i =

1; i <= nums.

size()

;++i)

else

if(k !=0&&

(pre_sum[j]

- pre_sum[i -1]

)% k ==

0&& j - i +

1>=2)

}}return

false;}

};

優化方案

1、空間換時間

map<

int,

int> mp;

key對應字首和,value對應索引

2、公式轉換

(arr[i]

- arr[j]

)%k ==

0進一步得到

arr[i]

%k == arr[j]

%k

3、程式結果

class

solution

else

}return

false;}

};

Leetcode 前k個高頻元素

思路大概是將陣列中所有元素的頻率記下來,然後統一使用最小堆來管理,將根節點與下乙個元素比較,將頻率更的高元素插入最小堆,同時進行堆排序操作,以此進行管理 在這裡發現原來c 有優先佇列priority queue可以達到相同的效果,優先佇列將權值最大的放在佇列的出口處,這樣就完成了類似的效果 原演算法...

LeetCode 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

leetcode 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 思路 利用資料結構,map來新增。因此map中記錄了nums i 為key,出現的次數count為values。之後通...