博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode-327 Count of Range Sum
阅读量:5165 次
发布时间:2019-06-13

本文共 1769 字,大约阅读时间需要 5 分钟。

题目描述

Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.

Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive.

 

题目大意

求一个数组中不同范围的和满足给定条件的范围的个数,即lower <= nums[i] + nums[i + 1] + ... + nums[j] <= upper

(要求时间复杂度小于O(N2))

 

示例

E1

Input: nums = [-2,5,-1], lower = -2, upper = 2,Output: 3 Explanation: The three ranges are : [0,0], [2,2], [0,2] and their respective sums are: -2, -1, 2.

 

解题思路

基于归并的思想,将数组分为两部分,递归求两部分数组的符合条件的范围个数,再求两个数组之和的满足条件的范围个数。

 

复杂度分析

时间复杂度:O(Nlog(N))

空间复杂度:O(N)

 

代码

class Solution {public:    int countRangeSum(vector
& nums, int lower, int upper) { int len = nums.size(); // 需要使用long类型,防止两个数字相加超过int范围 vector
sum(len + 1, 0); for(int i = 0; i < len; ++i) sum[i + 1] = (long)(sum[i] + nums[i]); return solve(sum, lower, upper, 0, len + 1); } int solve(vector
& sum, int lower, int upper, int low, int high) { // 如果数字只包含少于三个数字,则表示不能将数组分为两个部分以及一个中位数 if(high - low <= 1) return 0; int mid = (low + high) / 2, m = mid, n = mid, count = 0; // 递归求取分为两个部分的数组的范围个数 count = solve(sum, lower, upper, low, mid) + solve(sum, lower, upper, mid, high); // 求两个子数组之间的满足的范围个数 for(int i = low; i < mid; ++i) { while(m < high && (long)(sum[m] - sum[i]) < (long)lower) ++m; while(n < high && (long)(sum[n] - sum[i]) <= (long)upper) ++n; count += n - m; } inplace_merge(sum.begin() + low, sum.begin() + mid, sum.begin() + high); return count; }};

 

转载于:https://www.cnblogs.com/heyn1/p/11193669.html

你可能感兴趣的文章
Excel操作 Microsoft.Office.Interop.Excel.dll的使用
查看>>
解决Ubuntu下博通网卡驱动问题
查看>>
【bzoj2788】Festival
查看>>
执行gem install dryrun错误
查看>>
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
C语言初学 俩数相除问题
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
团队工作第二天
查看>>