1. 程式人生 > 實用技巧 >327. 區間和的個數 (leetcode 通過60/61個用例,oj通過 待補充)

327. 區間和的個數 (leetcode 通過60/61個用例,oj通過 待補充)

給定一個整數陣列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 };