查找具有给定总和的数组中子数组的数量-这是我的尝试,但无法正常工作
function getSubArrayCount(arr, sum) {
for (var i = 0; i < arr.length; i++) {
var str = [];
var csum= 0;
var output = 0;
for (var j = i; j < arr.length; j++) {
csum+= arr[j];
str.push(arr[j]);
if (csum== sum) {
return(str[i]);
}
}
}
}
console.log(getSubArrayCount([1,2,3,2,1,8,-3],5))
答案 0 :(得分:2)
还有一种方法,线性(取决于地图实现)的时间复杂度需要O(n)内存。
将累积总和与计数器一起存储在映射中(已经满足多少累积总和的次数)。在每一步中,检查当前的累加总和是否需要与存储的总和。
我对JS不熟悉,但似乎此代码有效
function getSubArrayCount(arr, sum) {
let map = new Map();
var cumsum = 0; var cnt = 0;
map.set(0, 1);
for (var i = 0; i < arr.length; i++) {
cumsum += arr[i];
if (map.has(cumsum - sum))
cnt += map.get(cumsum - sum);
if (map.has(cumsum))
map.set(cumsum, map.get(cumsum) + 1);
else
map.set(cumsum, 1);
}
return cnt;
}
console.log(getSubArrayCount([1,2,3,2,1,8,-3],5)); //3
console.log(getSubArrayCount([1,-2,3,-3,4,-2,-1,-1],0)); //5
答案 1 :(得分:1)
子数组定义为原始数组的连续块。如果您正在寻找的是,下面的代码应该可以工作:
function getSubArrayCount(arr, sum) {
var output = 0, csum = 0;
for (var i = 0; i < arr.length; i++) {
for (var j = i; j < arr.length; j++) {
csum+= arr[j];
if (csum== sum) {
output++;
}
}
csum= 0;
}
return output;
}
console.log(getSubArrayCount([1,2,3,2,1,8,-3],5));
答案 2 :(得分:0)
寻找给定总和的子阵列数目(一般-不连续)是NP难题。因此,我们需要计算2 ^ length个子数组的总和。此任务最困难的部分是生成第<div class="NavigationTop__groupRight__3UIqi">
<span class="NavigationTop__navPlayer__2TGn7">
<div id="myDropdown" class="dropdown-content">
<a onclick="myFunction()" href="#" class="NavigationTop__icon__32Kg3" data-ui-name="info">
<span class="NavigationTop__iconBg__3nlrW">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" height="16" width="16" class="UI__Icon__icon">
<path d="M15.6 32s-.1 0 0 0h-.8c-2.7 0-5.6 0-8.4-.8-3-.9-4.6-2.4-4.7-4.7-.1-1.1.3-2.2 1-3.1 1.1-1.5 2.7-2.4 4.1-3.1.5-.3 1-.5 1.5-.8.6-.4 2-1.4 2.1-2.7 0-.6-.2-1.3-.8-2.1l-.6-.9c-.4-.6-.8-1.2-1.2-1.9-1.2-2.5-1-5.6.4-7.9.2-.3.4-.6.7-.9 1.8-2 4.3-3.1 7-3.1 2.7-.1 5.3 1.1 7.2 3 .3.3.6.7.8 1 1.4 2.3 1.5 5.4.3 7.9-.4.7-.8 1.3-1.2 1.9l-.6.9c-.5.8-.8 1.5-.8 2.1.1 1.3 1.5 2.3 2.1 2.7.5.3 1 .6 1.5.8 1.4.7 3 1.5 4.1 3.1.7.9 1 2.1 1 3.1-.1 2.2-1.7 3.8-4.7 4.7-.7.2-1.4.3-2 .5-.7.1-1.5-.4-1.6-1.1-.1-.7.4-1.5 1.1-1.6.6-.1 1.2-.2 1.7-.4 2.4-.7 2.7-1.5 2.7-2.2 0-.5-.1-.9-.5-1.4-.7-1-1.9-1.6-3.1-2.3-.6-.3-1.1-.6-1.7-.9-2.1-1.3-3.3-3-3.4-4.9-.1-1.2.3-2.4 1.2-3.8.2-.3.4-.7.7-1 .4-.5.7-1 1-1.5.8-1.6.7-3.6-.2-5.2-.1-.1-.2-.2-.4-.5-1.3-1.4-3.2-2.2-5.2-2.2-1.9 0-3.7.8-5 2.2-.2.2-.3.4-.4.5-.9 1.6-1 3.6-.2 5.2.3.5.6 1 1 1.5.2.3.5.6.7 1 .9 1.3 1.3 2.6 1.2 3.8-.1 1.9-1.3 3.6-3.4 4.9-.5.3-1.1.6-1.7.9C6.9 23.4 5.7 24 5 25c-.3.4-.5.9-.5 1.4 0 .7.4 1.5 2.7 2.2 2.4.7 4.9.7 7.6.7h.8c.4 0 .8.2 1 .5.3.3.4.7.3 1.1 0 .6-.6 1.1-1.3 1.1z"></path></svg></span></a>
<div class="NavigationPlayer__nav__1GtYE NavigationPlayer__navOpen__kmIqC">
<ul class="NavigationPlayer__navSub__SIRkf">
<li class="NavigationPlayer__signUp__2AOMK">
<a href="#" class="NavigationPlayer__navLink__2oeuj NavigationPlayer__highlight__2lzxA" data-ui-name="signUp">Sign Up</a></li>
<li class="NavigationPlayer__signIn__3qaVH"><a href="#" class="NavigationPlayer__navLink__2oeuj" data-ui-name="signIn">Sign In</a></li>
<li><a href="#" class="NavigationPlayer__navLink__2oeuj" data-ui-name="legal">Legal</a></li>
<li><a href="#" class="NavigationPlayer__navLink__2oeuj" data-ui-name="privacy">Privacy</a></li>
<li><a href="#" class="NavigationPlayer__navLink__2oeuj" data-ui-name="support">Support</a></li>
<li><a href="#" class="NavigationPlayer__navLink__2oeuj" data-ui-name="cookies">Cookies</a></li>
<li>
<div class="NavigationPlayer__languageWrap__2jmcz">
<div class="UI__DropDown__custom-select LanguageSelector__dropdown__2uNdg">
<select class="select" data-ui-name="languageSelector">
<option value="de-DE">Deutsch</option>
<option value="en-US">English</option>
<option value="es-ES">Español</option>
<option value="es-MX">Español Latinoamérica</option>
<option value="fr-FR">Français</option>
<option value="it-IT">Italiano</option>
<option value="ja-JP">日本語</option>
<option value="ko-KR">한국어</option>
<option value="pl-PL">Polski</option>
<option value="pt-BR">Português do Brasil</option>
<option value="ru-RU">Русский</option>
<option value="zh-TW">繁體中文</option>
<option value="zh-CN">简体中文</option>
</select>
</div>
个子数组-我们可以通过
n
上面代码背后的想法是:如果我们在二进制系统中查看let sub= (a,n)=> a.filter((x,i)=> n&(1<<i))
,例如n
可以像在标记1/0上那样看待它,它指示我们对子数组采取哪个元素
n=1010011b
因此,我们测试数字n的第i位以滤除第i个元素。极端情况:我假设如果sum = 0,那么我们也计算空数组。这是完整的解决方案
[ 1, 2, 3, 2, 1, 8,-3 ]
1 0 1 0 0 1 1 -> [1,3,8,-3]
我认为子数组可以重复。如果我们不允许子数组重复,那么答案将会更加复杂。