[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]
【問(wèn)題描述】[第560題][和為K的子數(shù)組][中等]
給定一個(gè)整數(shù)數(shù)組和一個(gè)整數(shù) k,你需要找到該數(shù)組中和為 k 的連續(xù)的子數(shù)組的個(gè)數(shù)。示例 1 :輸入:nums = [1,1,1], k = 2 輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。 說(shuō)明 :數(shù)組的長(zhǎng)度為 [1, 20,000]。 數(shù)組中元素的范圍是 [-1000, 1000] ,且整數(shù) k 的范圍是 [-1e7, 1e7]。【解答思路】
1. 暴力
時(shí)間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(1)
public int subarraySum(int[] nums, int k) {int count = 0;int len = nums.length;for (int left = 0; left < len; left++) {int sum = 0;// 區(qū)間里可能會(huì)有一些互相抵銷(xiāo)的元素for (int right = left; right < len; right++) {sum += nums[right];if (sum == k) {count++;}}}return count;}2.前綴和
- 構(gòu)建前綴和數(shù)組,以快速計(jì)算區(qū)間和;
- 注意在計(jì)算區(qū)間和的時(shí)候,下標(biāo)有偏移。
時(shí)間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(N)
3. 前綴和 + 哈希表優(yōu)化
時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)
由于只關(guān)心次數(shù),不關(guān)心具體的解,我們可以使用哈希表加速運(yùn)算;
由于保存了之前相同前綴和的個(gè)數(shù),計(jì)算區(qū)間總數(shù)的時(shí)候不是一個(gè)一個(gè)地加,時(shí)間復(fù)雜度降到了 O(N)O(N)。
preSumFreq.put(0, 1):數(shù)組中有些數(shù)直接就等于k
【總結(jié)】
1. 暴力優(yōu)化
2.哈希表 關(guān)于次數(shù)的優(yōu)化
3.HashMap
(1) 插入鍵值對(duì)數(shù)據(jù)
public V put(K key, V value)
(2)根據(jù)鍵值獲取鍵值對(duì)值數(shù)據(jù)
public V get(Object key)
(3)獲取Map中鍵值對(duì)的個(gè)數(shù)
public int size()
(4)判斷Map集合中是否包含鍵為key的鍵值對(duì)
public boolean containsKey(Object key)
(5)判斷Map集合中是否包含值為value的鍵值對(duì)
boolean containsValue(Object value)
(6)判斷Map集合中是否沒(méi)有任何鍵值對(duì)
public boolean isEmpty()
(7)清空Map集合中所有的鍵值對(duì)
public void clear()
(8)根據(jù)鍵值刪除Map中鍵值對(duì)
public V remove(Object key)
遍歷hashMap
for (Integer key : map.keySet()) { if (map.get(key) == 1) {return key;}原文鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/bao-li-jie-fa-qian-zhui-he-qian-zhui-he-you-hua-ja/
參考鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/560ti-he-wei-kde-zi-shu-zu-by-iceblood/
總結(jié)
以上是生活随笔為你收集整理的[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot的配置项
- 下一篇: 罗技鼠标驱动怎么下载?