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 ...
随机推荐
- Django框架ORM单表删除表记录_模型层
此方法依赖的表是之前创建的过的一张表 参考链接:https://www.cnblogs.com/apollo1616/p/9840354.html 1.删除方法就是delete(),它运行时立即删除对 ...
- SHA-1算法c语言实现
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signatu ...
- PHP生成图片太慢了。。有些都不出来、
现在为了使用不同宽高的图片,做了个动态生成的程序.每次根据图片传入的宽高来输出图片,然后 html 页面里用 <img src="xxx.com/img?src=c8d997dae15 ...
- BA优化PnP的思路
由之前的PnP,可以求出一个R,t,K又是已知的.而且空间点的世界坐标知道,第二个相机位姿的像素坐标也是知道的.就可以利用它们进行优化.首先确定变量为const vector<Point3f&g ...
- TCP服务器端和客户端程序设计【转】
本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 ...
- HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4529 郑厂长系列故事——N骑士问题 Time Limit: 6000/3000 MS (Java/Ot ...
- 主成分分析(PCA)与SVD奇异值分解
主要参考:https://www.zhihu.com/question/38417101/answer/94338598 http://blog.jobbole.com/88208/ 先说下PCA ...
- 9.2 NOIP提高组试题精解(1)
9-16 poise.c #include <stdio.h> #define MAXN 1001 int main() { ], flag[MAXN] = { }; //保存6种砝码的数 ...
- ffmpeg 调试
--enable-debug=3 --disable-optimizations --disable-yasm --disable-asm
- BZOJ 1638 [Usaco2007 Mar]Cow Traffic 奶牛交通:记忆化搜索【图中边的经过次数】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1638 题意: 给你一个有向图,n个点,m条有向边. 对于所有从入度为0的点到n的路径,找出 ...