leetcode1546題解【字首和+貪心】

Z發表於2020-09-20

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;
    }
};

相關文章