TongSh的博客

TongSh的博客

Subarray Sum Equals K (O(n)时间复杂度)

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

最简单的想法是,遍历所有可能的子序列,分别求各个子序列的和。这样一来,可能的子序列有O(n^2)种,每种子序列求和又需要O(n)的复杂度。最终总的时间复杂度将达到O(n^3).

当然可以使用容器保存已经算好的前n个值的和,这样可以将总的时间复杂度降低到O(n^2).

要想达到时间限制要求,就需要使用O(n)的时间复杂度的算法。从头遍历数组,累加从第1个元素到第h个元素的值,按照h的下标将累加值存到map中(因为下标不连续)。这样,如果map(h-k)在map中存在,说明从h-k 到 h期间,肯定有元素的和刚好等于k。

        int cum=0; // cumulated sum
        map<int,int> rec; // prefix sum recorder
        int cnt = 0; // number of found subarray
        rec[0]++; // to take into account those subarrays that begin with index 0
        for(int i=0;i<nums.size();i++){
            cum += nums[i];
            cnt += rec[cum-k];
            rec[cum]++;
        }
        return cnt;

阅读更多
个人分类: Algorithm
上一篇Queue Reconstruction by Height (根据身高排队)
下一篇Largest Sum of Averages
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭