leetcode1546題解【前綴和+貪心】

leetcode1546.和為目標值的最大數目不重疊非空子數組數目

題目鏈接

算法

前綴和+貪心

時間複雜度O(n)。

1.對nums數組求前綴和;

2.在求前綴和過程中將前綴和sum插入到set集合中,每次都在set集合中尋找sum-target是否存在,如果存在,說明存在這麼一個子數組,滿足該子數組中的數字和等於target;

3.在set集合中找到sum-target後,就記錄一次,同時需要將sum清零並且將set集合清空,目的是讓符合條件的子數組不重疊。

C++代碼

class Solution {
public:
    int maxNonOverlapping(vector<int>& nums, int target) {
        int len = nums.size();
        int sum = 0, res = 0;
        set<int> hs;    //記錄前綴和
        hs.insert(0);
        for(int i = 0; i < len; i++){
            sum += nums[i];
            if(hs.find(sum - target) != hs.end()){
                sum = 0;
                hs.clear();     //為了不讓子數組重疊,需要清空數組
                res++;  
            }   
            hs.insert(sum);
        }
        return res;
    }
};