日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表)

發(fā)布時(shí)間:2024/7/23 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 題目描述
  • 思路 & 代碼
      • 暴力法 O(n2n^2n2)
      • 前綴和 + 哈希表 O(n)
      • 二刷

題目描述

  • 第一道前綴和題目~

思路 & 代碼

暴力法 O(n2n^2n2)

  • 固定一個(gè)值,從后往前找滿足的條件即可
class Solution {public int subarraySum(int[] nums, int k) {int ans = 0;for(int i = 0; i < nums.length; i++){int temp = 0;for(int j = i; j >= 0; j--){temp += nums[j];if(temp == k){ans++;}}}return ans;} }

前綴和 + 哈希表 O(n)

  • 連續(xù)子數(shù)組值 = preNum[j] - preNum[i],很巧妙
  • 一次遍歷動(dòng)態(tài)哈希,一邊維護(hù)一邊找~
class Solution {public int subarraySum(int[] nums, int k) {// 前綴和 & 哈希表(前綴和值 - 出現(xiàn)次數(shù))Map<Integer, Integer> hashmap = new HashMap<>();// 代表第一個(gè)元素的前綴和,初始化hashmap.put(0, 1);int preSum = 0;int ans = 0;for(int num : nums){preSum += num;// 如果之前有滿足的前綴和(注意是 preSum - k)if(hashmap.containsKey(preSum - k)){ans += hashmap.get(preSum - k);}// 維護(hù)哈希表hashmap.put(preSum, hashmap.getOrDefault(preSum, 0) + 1);}return ans;} }

二刷

  • 才發(fā)現(xiàn)對(duì)前綴和這個(gè)概念不是很熟悉…
  • 說實(shí)話我覺得這題代碼相對(duì)抽象,有必要用點(diǎn)簡單例子人腦走一遍:
  • 比如 map.put(0, 1) 這一行(比如[1, 1], 2。沒有這一行就直接得 0 了)
  • (雖然圖片有點(diǎn)丑,但是請(qǐng)勉強(qiáng)看看吧 = = )
  • 這么個(gè)意思,累加 sum,如果發(fā)現(xiàn)當(dāng)前 sum,在 - k 之后的值,曾經(jīng)出現(xiàn)過,那么說明存在圖中連續(xù)的橙色子數(shù)組,滿足累加和 = k
class Solution {public int subarraySum(int[] nums, int k) {Map<Integer, Integer> map = new HashMap<>();map.put(0, 1);int sum = 0, res = 0;for(int temp : nums) {sum += temp;if(map.containsKey(sum - k)) {res += map.get(sum - k);}map.put(sum, map.getOrDefault(sum, 0) + 1);}return res;} }

總結(jié)

以上是生活随笔為你收集整理的【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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