簡體   English   中英

Javascript - 子數組和等於 K

[英]Javascript - Subarray Sum Equals K

我只是在看一些面試問題,遇到了這個人

Given an array of integers and an integer k, 
you need to find the total number of continuous subarrays whose sum equals to k.

Example 1:
Input:nums = [1,1,1], k = 2
Output: 2

我知道我可以循環並以更冗長的方式執行此操作,但我想知道是否可以使用reduce

當我將以下 arguments 傳遞給它時,我有以下失敗:

subarraySum([-1,-1,1], 0)

const subarraySum = (nums, k) => {
    let answer = 0;
    nums.reduce((acc, val) => {          
        if(acc + val === k) {
            answer++;
            return val;
        }
        if(val === k) {
            answer++
            return val
        }
        return acc + val;
    }, 0)

    return answer;
};

減少將是一個矯枉過正。 此外,為每個元素調用其回調的開銷會使您的算法效率降低。

相反,for 循環是 go 的最佳方式。 您可以在下面找到一個可能的非天真的解決方案:

 var arr = [1, 2, 3, 4, 5]; var map = []; var counter = 0; var k = 5; function updateMap(newValue) { map.push(0); // Placeholder for the new value; for (var i = 0; i < map.length; i++) { map[i] += newValue; // Increment the subcounts. if (map[i] === k) { counter++; // Found a match map = map.splice(i, 1); // Remove the matching subcount so you don't update nor check it again. } } } for(var i = 0; i < arr.length; i++){ updateMap(arr[i]); } console.log("Results: " + counter);

是的,為了在線性時間內回答問題,在這里使用reduce非常方便,因為它讓我們可以更新和重新訪問累積值:

 const subarraySum = (nums, k) => nums.reduce(([map, sum, answer], val) => { const newSum = sum + val; answer += newSum == k; answer += map[newSum - k] || 0; map[newSum] = (map[newSum] || 0) + 1; return [map, newSum, answer]; }, [{}, 0, 0])[2]; console.log(subarraySum([-1,-1,1], 0)); console.log(subarraySum([1,-1,1,-1], 0));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM