930. Binary Subarrays With Sum
Если задан двоичный массив nums и целочисленная цель, верните количество непустых подмассивов с целью sum. Подмассив - это смежная часть массива.
Пример:
Input: nums = [1,0,1,0,1], goal = 2
Output: 4
C# решение
сопоставлено/оригиналusing System.Collections.Generic;
public class Solution {
public int NumSubarraysWithSum(int[] nums, int goal) {
var prefixSumCount = new Dictionary<int, int>();
prefixSumCount[0] = 1;
int currentSum = 0;
int count = 0;
foreach (int num in nums) {
currentSum += num;
if (prefixSumCount.ContainsKey(currentSum - goal)) {
count += prefixSumCount[currentSum - goal];
}
if (prefixSumCount.ContainsKey(currentSum)) {
prefixSumCount[currentSum]++;
} else {
prefixSumCount[currentSum] = 1;
}
}
return count;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int NumSubarraysWithSum(vector<int>& nums, int goal) {
var prefixSumCount = new unordered_map<int, int>();
prefixSumCount[0] = 1;
int currentSum = 0;
int count = 0;
foreach (int num in nums) {
currentSum += num;
if (prefixSumCount.count(currentSum - goal)) {
count += prefixSumCount[currentSum - goal];
}
if (prefixSumCount.count(currentSum)) {
prefixSumCount[currentSum]++;
} else {
prefixSumCount[currentSum] = 1;
}
}
return count;
}
}
Java решение
сопоставлено/оригиналimport java.util.HashMap;
import java.util.Map;
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
Map<Integer, Integer> prefixSumCount = new HashMap<>();
prefixSumCount.put(0, 1);
int currentSum = 0;
int count = 0;
for (int num : nums) {
currentSum += num;
count += prefixSumCount.getOrDefault(currentSum - goal, 0);
prefixSumCount.put(currentSum, prefixSumCount.getOrDefault(currentSum, 0) + 1);
}
return count;
}
}
Python решение
сопоставлено/оригиналdef numSubarraysWithSum(nums, goal):
prefix_sum_count = {0: 1}
current_sum = 0
count = 0
for num in nums:
current_sum += num
if current_sum - goal in prefix_sum_count:
count += prefix_sum_count[current_sum - goal]
if current_sum in prefix_sum_count:
prefix_sum_count[current_sum] += 1
else:
prefix_sum_count[current_sum] = 1
return count
Go решение
сопоставлено/оригиналpackage main
import "fmt"
func numSubarraysWithSum(nums []int, goal int) int {
prefixSumCount := make(map[int]int)
prefixSumCount[0] = 1
currentSum, count := 0, 0
for _, num := range nums {
currentSum += num
if val, exists := prefixSumCount[currentSum-goal]; exists {
count += val
}
prefixSumCount[currentSum]++
}
return count
}
func main() {
nums := []int{1, 0, 1, 0, 1}
goal := 2
fmt.Println(numSubarraysWithSum(nums, goal))
}
Algorithm
Использовать словарь для хранения количества встреченных сумм префиксов.
Инициализировать текущую сумму и счетчик подмассивов с нулевыми значениями.
Пройти по массиву и обновить текущую сумму.
Если текущая сумма минус цель уже в словаре, добавить количество таких префиксов к счетчику подмассивов.
Обновить словарь префиксных сумм.
Вернуть счетчик подмассивов.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.
Активных вакансий пока нет.