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 ...
随机推荐
- [持续集成]Jenkins 自动化部署 Maven 工程
一.Jenkins 持续部署原理图 基础服务: 1 SVN 服务 SVN是Subversion的简称,是一个开放源代码的版本控制系统.说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的 ...
- JavaScript判断图片是否加载完成的三种方式 (转)
一.load事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE HTML> <html> <head> ...
- redis的安装与类型
redis Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 源码安装 redis , 编译安装 为何用源码安装,不用yum安装, 编译安装的优势 ...
- 4.Web工程师的开发工具箱
第四章 效率工具ShadowSocks window代理服务器FalconProxy chrome代理服务器stackoverflow.com Stack Overflow是一个与程序相关的IT技术问 ...
- css三角形实现的几种方法的区别
演变: .triangle{ height: 30px; width: 30px; display: inline-block; border: 30px solid; border-color: # ...
- uboot中添加自定义命令
uboot中可以通过修改源程序来添加自定义命令,进一步扩展uboot的功能. 我想在uboot下添加一条新的命令(名为varcpy),用来拷贝uboot中的环境变量. 修改方式如下: 创建新文件com ...
- Spring Boot2.0之统一处理web请求日志
试问,你的项目中,如果有几万个方法,你还这么写log.info("name"+name+",age"+age )日志么?low~ 所以用AOP呀 1.首先创建个 ...
- 应用提交 App Store 上架被拒绝
审核的参考资料 https://developer.apple.com/icloud/documentation/data-storage/index.html https://developer.a ...
- [算法]从Trie树(字典树)谈到后缀树
我是好文章的搬运工,原文来自博客园,博主July_,地址:http://www.cnblogs.com/v-July-v/archive/2011/10/22/2316412.html 从Trie树( ...
- 【Lintcode】029.Interleaving String
题目: Given three strings: s1, s2, s3, determine whether s3 is formed by the interleaving of s1 and s2 ...