日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组] 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【問(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)
public class Solution {public int subarraySum(int[] nums, int k) {int len = nums.length;// 計(jì)算前綴和數(shù)組int[] preSum = new int[len + 1];preSum[0] = 0;for (int i = 0; i < len; i++) {preSum[i + 1] = preSum[i] + nums[i];}int count = 0;for (int left = 0; left < len; left++) {for (int right = left; right < len; right++) {// 區(qū)間和 [left..right],注意下標(biāo)偏移if (preSum[right + 1] - preSum[left] == k) {count++;}}}return count;} }
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

import java.util.HashMap; import java.util.Map;public class Solution {public int subarraySum(int[] nums, int k) {// key:前綴和,value:key 對(duì)應(yīng)的前綴和的個(gè)數(shù)Map<Integer, Integer> preSumFreq = new HashMap<>();// 對(duì)于下標(biāo)為 0 的元素,前綴和為 0,個(gè)數(shù)為 1preSumFreq.put(0, 1);int preSum = 0;int count = 0;for (int num : nums) {preSum += num;// 先獲得前綴和為 preSum - k 的個(gè)數(shù),加到計(jì)數(shù)變量里if (preSumFreq.containsKey(preSum - k)) {count += preSumFreq.get(preSum - k);}// 然后維護(hù) preSumFreq 的定義preSumFreq.put(preSum, preSumFreq.getOrDefault(preSum, 0) + 1); //getOrDefault 有就是get preSum的對(duì)應(yīng)的值 不存在就為0}return count;} } public class Solution {public int subarraySum(int[] nums, int k) {// 記錄區(qū)間和為 k 的個(gè)數(shù)和數(shù)組前綴元素和。int ans = 0, curr = 0;// 創(chuàng)建 hashMap 記錄數(shù)組前綴和以及當(dāng)前和對(duì)應(yīng)的前綴個(gè)數(shù)。HashMap<Integer, Integer> map = new HashMap<>();// 遍歷前初始化前綴和為 0 的個(gè)數(shù)為 1 。map.put(0, 1);for (int num : nums) {// 依次遍歷并累加數(shù)組元素。curr += num;int pre = curr - k;// 如果之前有前綴和等于 curr - k ,表示從該前綴之后到當(dāng)前元素區(qū)間和為 k 。if (map.containsKey(pre)) {// 疊加和為 k 的區(qū)間個(gè)數(shù)。ans += map.get(pre);}// 遍歷完每個(gè)元素后,記錄當(dāng)前前綴和以及個(gè)數(shù)。if (map.containsKey(curr)) {map.put(curr, map.get(curr) + 1);} else {map.put(curr, 1);}}return ans;} }

【總結(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。