Java实现 LeetCode 327 区间和的个数
327. 区间和的个数
给定一个整数数组 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。
class Solution {
   public int countRangeSum(int[] nums, long lower, long upper) {
        long sums[] = new long[nums.length];
        for (int i=0; i<nums.length; i++) {
            sums[i] = ((i-1 >= 0) ? sums[i-1] : 0) + nums[i];
        }
        //System.out.println(Arrays.toString(sums));
        int result = divideAndConquer(sums, 0, sums.length-1, upper, lower);
        return result;
    }
    private int divideAndConquer(long sums[], int start, int end, long upper, long lower) {
        if (start > end) return 0;
        if (start == end) return (sums[start] <= upper && sums[start] >= lower) ? 1 : 0;
        int mid = (start+end)/2;
        int counts = 0;
        counts += divideAndConquer(sums, start, mid, upper, lower);
        counts += divideAndConquer(sums, mid+1, end, upper, lower);
        int ls = start, le=mid;
        while (le >= start && sums[mid+1] - sums[le] <= upper) le--;
        for (int r=mid+1; r<=end; r++) {
            while (ls <= mid && sums[r] - sums[ls] >= lower) ls++;
            while (le+1 <= mid && sums[r] - sums[le+1] > upper ) le++;
            if (ls - le -1 < 0) continue;
            counts += (ls-le-1);
        }
        ls = start;
        int i = 0, r= mid+1;
        long merged[] = new long[end-start+1];
        while (ls <= mid || r <= end) {
            if (ls > mid || (r<=end && sums[r] < sums[ls])) {
                merged[i++] = sums[r++];
            } else {
                merged[i++] = sums[ls++];
            }
        }
        for (i=0; i<merged.length; i++) {
            sums[start+i] = merged[i];
        }
        //System.out.println(Arrays.toString(sums) + " "  + counts + "," + start + "-" + end);
        return counts;
    }
}
Java实现 LeetCode 327 区间和的个数的更多相关文章
- Leetcode 327.区间和的个数
		区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper.区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的 ... 
- Java实现 LeetCode 795 区间子数组个数 (暴力分析)
		795. 区间子数组个数 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = ... 
- Java实现 LeetCode 191 位1的个数
		191. 位1的个数 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例 1: 输入:000000000000000000000000000 ... 
- Java实现 LeetCode 611 有效三角形的个数(双指针)
		611. 有效三角形的个数 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数. 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 ( ... 
- Java实现 LeetCode 421 数组中两个数的最大异或值
		421. 数组中两个数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算 ... 
- Java实现 LeetCode 233 数字 1 的个数
		233. 数字 1 的个数 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数. 示例: 输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 1 ... 
- Java实现 LeetCode 222 完全二叉树的节点个数
		222. 完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集 ... 
- hdu 5869 区间不同GCD个数(树状数组)
		Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ... 
- LeetCode:有效三角形的个数【611】
		LeetCode:有效三角形的个数[611] 题目描述 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数. 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有 ... 
随机推荐
- flush方法和close方法的区别
			package com.yhqtv.demo05.Writer; import java.io.FileWriter; /* * @author XMKJ yhqtv.com Email:yhqtv@ ... 
- .netcore 部署时遇到413 Request Entity Too Large 和 413Payload Too Large 的问题
			.netcore3.1 遇到一个webapi 上传大文件问题 首先,在kestrel模式调试模式下上传 会报错413, 需要在三个地方添加 1.startup中 这里设置的2g最大值 2.在progr ... 
- Python --表达式和运算符
			表达式 由一个或者几个数字或者变量和运算符组合成的一行代码 通常会返回一个结果 运算符 由一个以上的值经过变化得到新值的过程就叫做运算 用于运算的符号称为运算符 运算符的分类: 算数运算符 比较或者关 ... 
- chmod的用法
			指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案 ... 
- 【Python】【第二节】【时间与日期处理模块】
			转载至https://blog.csdn.net/p9bl5bxp/article/details/54945920 Python中提供了多个用于对日期和时间进行操作的内置模块:time模块.date ... 
- NetCore项目实战篇07---服务保护之polly
			1. 为什么要用polly 前面的项目中,一个服务调用另一个(Zhengwei.Identity调用Zhengwei.Use.Api)服务时是直接调用的,在这个调用的过程中可能会发生各种瞬态故障,这 ... 
- 10.2 Go redis
			10.2 Go redis redis是NoSQL数据, 不是传统的关系型数据库.linux,windows环境皆可安装. https://redis.io http://www.redis.cn r ... 
- 3.9 Go Slice切片
			3.9 Go Slice切片 Go语言切片(Slice) 切片是可动态变化的序列,是对数组的引用,引用类型,遵循引用传递的机制 slice类型写作[ ]T,T是slice元素类型,var s1 []i ... 
- RBAC权限分配
			RABC:基于角色的权限访问控制(Role-Based Access Control) 一般在登录系统认证通过后,会先确定的该用户的操作权限,判断用户的后续操作是否合法! RABC至少需要三张表:用户 ... 
- 06.drf(django)的权限
			默认配置已经启用权限控制 settings 'django.contrib.auth', 默认 migrate 会给每个模型赋予4个权限,如果 ORM 类不托管给django管理,而是直接在数据库中建 ... 
