zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    Python操作文件和目录
    ffmpeg命令简单使用
    【转载】一个简单的爬虫:爬取豆瓣的热门电影的信息
    【转载】正则表达式re.S的用法
    linux用户添加
    SQL语句update修改数据库字段
    linux命令之cp
    linux命令——tree命令
    Linux磁盘管理
    Python资源安装过程出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))…………
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13354597.html
Copyright © 2011-2022 走看看