327. 區間和的個數 (leetcode 通過60/61個用例,oj通過 待補充)
阿新 • • 發佈:2020-07-21
給定一個整數陣列nums,返回區間和在[lower, upper]之間的個數,包含lower和upper。
區間和S(i, j)表示在nums中,位置從i到j的元素之和,包含i和j(i ≤ j)。
說明:
最直觀的演算法複雜度是O(n2) ,請在此基礎上優化你的演算法。
示例:
輸入: nums = [-2,5,-1], lower = -2, upper = 2,
輸出: 3
解釋: 3個區間分別是: [0,0], [2,2], [0,2],它們表示的和分別為: -2, -1, 2。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/count-of-range-sum
1 class Solution { 2 public: 3 //最暴力的解法 4 int countRangeSum(vector<int>& nums, int lower, int upper) { 5 int res=0; 6 for(int i=1;i<=nums.size();i++) 7 { 8 for(int j=0;j<nums.size()-i+1;j++) 9 {10 long long sum=0; 11 for(int k=j;k<j+i;k++) 12 sum+=(long long)nums[k]; 13 if(sum>=lower&&sum<=upper)res++; 14 } 15 } 16 return res; 17 } 18 };
class Solution { public: //增加一個數組 儲存長度為len起始位置為i的加和 每次都儲存在長度為len的子集的最後一位int countRangeSum(vector<int>& nums, int lower, int upper) { int res=0; vector<long> sum_vec; for(auto item:nums) { if(item>=lower&&item<=upper)res++; sum_vec.push_back(item); } for(int i=1;i<nums.size();i++) { for(int j=nums.size()-1;j>=i;j--) { sum_vec[j]=sum_vec[j-1]+(long)nums[j]; if(sum_vec[j]>=lower&&sum_vec[j]<=upper)res++; } } return res; } };
1 class Solution { 2 public: 3 //儲存字首和 通過60/61個 4 int countRangeSum(vector<int>& nums, int lower, int upper) { 5 int res=0; 6 vector<long> prefix_sum(nums.size()+1,0); 7 for(int i=1;i<=nums.size();i++) 8 prefix_sum[i]=prefix_sum[i-1]+(long)nums[i-1]; 9 for(int k=1;k<=nums.size();k++) 10 { 11 for(int i=k;i<=nums.size();i++) 12 { 13 long val=prefix_sum[i]-prefix_sum[i-k]; 14 if(val>=lower&&val<=upper)res++; 15 } 16 } 17 return res; 18 } 19 };