LintCode "Subarray Sum"

sum[i..j] = sum[0..j] - sum[0..i-1]. We use a hashmap to check a previous matching index with a given number.

class Solution {
public:
    vector<int> subarraySum(vector<int> nums){
        size_t len = nums.size();
        
        unordered_map<long, vector<int>> hm;
        
        vector<long> lsum(len);
        lsum[0] = nums[0];
        hm[lsum[0]].push_back(0);
        for(int i = 1 ; i < len; i ++)
        {
            lsum[i] = nums[i] + lsum[i - 1];
            hm[lsum[i]].push_back(i);
        }        
            
        vector<int> ret;
        for(int i = 0; i < len; i++)
        {
            if(lsum[i] == 0)
            {
                ret.push_back(0);
                ret.push_back(i);
                return ret;
            }
            else
            {
                if(hm.find(lsum[i]) != hm.end())
                {
                    if(!hm[lsum[i]].empty() && hm[lsum[i]][0] < i)
                    {
                        ret.push_back(hm[lsum[i]][0] + 1);
                        ret.push_back(i);    
                        return ret;
                    }
                }
            }
        }
        
        return ret;
    }
};
View Code
原文地址:https://www.cnblogs.com/tonix/p/4781194.html