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。之後通...