327. Count of Range Sum(inplace_marge)
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.
Note:
A naive algorithm of O(n2) is trivial. You MUST do better than that.
Example:
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.
Approach #1: C++.
class Solution {
public:
int countRangeSum(vector<int>& nums, int lower, int upper) {
int len = nums.size();
if (len == 0) return 0;
vector<long> sum(len+1, 0);
for (int i = 0; i < len; ++i)
sum[i+1] += sum[i] + nums[i];
return mergeSort(sum, lower, upper, 0, len+1);
} private:
int mergeSort(vector<long>& sum, int lower, int upper, int left, int right) {
if (right - left <= 1) return 0;
int mid = left + (right - left) / 2;
int m = mid, n = mid, count = 0;
count = mergeSort(sum, lower, upper, left, mid) + mergeSort(sum, lower, upper, mid, right);
for (int i = left; i < mid; ++i) {
while (m < right && sum[m] - sum[i] < lower) m++;
while (n < right && sum[n] - sum[i] <= upper) n++;
count += n - m;
}
inplace_merge(sum.begin()+left, sum.begin()+mid, sum.begin()+right);
return count;
}
};
Approach #2: Java.
class Solution {
public int countRangeSum(int[] nums, int lower, int upper) {
if (nums == null || nums.length == 0) return 0;
long[] sums = new long[nums.length];
long sum = 0;
for (int i = 0; i < nums.length; ++i) {
sum += nums[i];
sums[i] += sum;
}
return mergeSort(sums, lower, upper, 0, nums.length-1);
} private int mergeSort(long[] sums, int lower, int upper, int left, int right) {
if (right < left) return 0;
else if (left == right) {
if (sums[left] >= lower && sums[right] <= upper) return 1;
else return 0;
}
int mid = left + (right - left) / 2;
int count = mergeSort(sums, lower, upper, left, mid) + mergeSort(sums, lower, upper, mid+1, right);
int m = mid+1, n = mid+1;
for (int i = left; i <= mid; ++i) {
while (m <= right && sums[m] - sums[i] < lower) m++;
while (n <= right && sums[n] - sums[i] <= upper) n++;
count += n - m;
}
mergeHelper(sums, left, mid, right);
return count;
} private void mergeHelper(long[] sums, int left, int mid, int right) {
int i = left;
int j = mid + 1;
long[] copy = new long[right-left+1];
int p = 0;
while (i <= mid && j <= right) {
if (sums[i] < sums[j]) {
copy[p++] = sums[i++];
} else {
copy[p++] = sums[j++];
}
} while (i <= mid) {
copy[p++] = sums[i++];
} while (j <= right) {
copy[p++] = sums[j++];
} System.arraycopy(copy, 0, sums, left, right-left+1);
}
}
Approach #3: Python.
class Solution(object):
def countRangeSum(self, nums, lower, upper):
"""
:type nums: List[int]
:type lower: int
:type upper: int
:rtype: int
"""
first = [0]
for num in nums:
first.append(first[-1] + num) def sort(lo, hi):
mid = (lo + hi) / 2
if mid == lo:
return 0
count = sort(lo, mid) + sort(mid, hi)
i = j = mid
for left in first[lo:mid]:
while i < hi and first[i] - left < lower: i += 1
while j < hi and first[j] - left <= upper: j += 1
count += j - i
first[lo:hi] = sorted(first[lo:hi])
return count
return sort(0, len(first))
Notes:
C++ -----> inplace_merge
default (1) |
template <class BidirectionalIterator> |
---|---|
custom (2) |
template <class BidirectionalIterator, class Compare> |
Merges two consecutive sorted ranges: [first,middle)
and [middle,last)
, putting the result into the combined sorted range [first,last)
.
The elements are compared using operator<
for the first version, and comp for the second. The elements in both ranges shall already be ordered according to this same criterion (operator<
or comp). The resulting range is also sorted according to this.
The function preserves the relative order of elements with equivalent values, with the elements in the first range preceding those equivalent in the second.
for example:
// inplace_merge example
#include <iostream> // std::cout
#include <algorithm> // std::inplace_merge, std::sort, std::copy
#include <vector> // std::vector int main () {
int first[] = {5,10,15,20,25};
int second[] = {50,40,30,20,10};
std::vector<int> v(10);
std::vector<int>::iterator it; std::sort (first,first+5);
std::sort (second,second+5); it=std::copy (first, first+5, v.begin());
std::copy (second,second+5,it); std::inplace_merge (v.begin(),v.begin()+5,v.end()); std::cout << "The resulting vector contains:";
for (it=v.begin(); it!=v.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n'; return 0;
}
output:
The resulting vector contains: 5 10 10 15 20 20 25 30 40 50
327. Count of Range Sum(inplace_marge)的更多相关文章
- 327. Count of Range Sum
/* * 327. Count of Range Sum * 2016-7-8 by Mingyang */ public int countRangeSum(int[] nums, int lowe ...
- 【算法之美】你可能想不到的归并排序的神奇应用 — leetcode 327. Count of Range Sum
又是一道有意思的题目,Count of Range Sum.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/leetcode ...
- [LeetCode] 327. Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- leetcode@ [327] Count of Range Sum (Binary Search)
https://leetcode.com/problems/count-of-range-sum/ Given an integer array nums, return the number of ...
- 【LeetCode】327. Count of Range Sum
题目: Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusiv ...
- 327 Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- LeetCode 327. Count of Range Sum
无意看到的LeetCode新题,不算太简单,大意是给一个数组,询问多少区间和在某个[L,R]之内.首先做出前缀和,将问题转为数组中多少A[j]-A[i] (j>i)在范围内. 有一种基于归并排序 ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- LeetCode Count of Range Sum
原题链接在这里:https://leetcode.com/problems/count-of-range-sum/ 题目: Given an integer array nums, return th ...
随机推荐
- PYTHON调用C接口(基于Ctypes)实现stein算法最大公约数的计算
相关环境配置 mingw,选择相应的32位.64位的版本,主要用于编译动态链接库dll文件,可用vs替代,这里我选择轻量级的mingw windows64位地址:https://sourceforge ...
- Java for LeetCode 110 Balanced Binary Tree
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- maven GroupID和ArtifactID
GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称.一般Gro ...
- SVG圆盘时钟动画
在线演示 本地下载
- UVA - 11475 Extend to Palindrome —— 字符串哈希 or KMP or 后缀数组
题目链接:https://vjudge.net/problem/UVA-11475 题意: 给出一个字符串,问在该字符串后面至少添加几个字符,使得其成为回文串,并输出该回文串. 题解: 实际上是求该字 ...
- win10安装tomcat7
下载Tomcat 安装tomcat tomcat7是绿色软件,解压后即可使用,请大家先将tomcat解压到合适的位置(建议整个路径都是英文路径),下载 apache-tomcat-7.0.79-win ...
- zabbix监控系统性能采集指标
监控项目 详细内容 ...
- JNDI数据源配置
一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");) ②连接数据库(Connec ...
- listen 80
Facebook Quietly Created New Email Addresses For a company that made its name by building one of the ...
- 语义化npm版本号
参考资料: 语义化版本2.0.0 the semantic versioner for npm 在package的devDependencies和dependencies2个字段中有指定依赖包版本,这 ...