当前位置: 首页 > news >正文

Java | Leetcode Java题解之第327题区间和的个数

题目:

题解:

class Solution {public int countRangeSum(int[] nums, int lower, int upper) {long sum = 0;long[] preSum = new long[nums.length + 1];for (int i = 0; i < nums.length; ++i) {sum += nums[i];preSum[i + 1] = sum;}BalancedTree treap = new BalancedTree();int ret = 0;for (long x : preSum) {long numLeft = treap.lowerBound(x - upper);int rankLeft = (numLeft == Long.MAX_VALUE ? (int) (treap.getSize() + 1) : treap.rank(numLeft)[0]);long numRight = treap.upperBound(x - lower);int rankRight = (numRight == Long.MAX_VALUE ? (int) treap.getSize() : treap.rank(numRight)[0] - 1);ret += rankRight - rankLeft + 1;treap.insert(x);}return ret;}
}class BalancedTree {private class BalancedNode {long val;long seed;int count;int size;BalancedNode left;BalancedNode right;BalancedNode(long val, long seed) {this.val = val;this.seed = seed;this.count = 1;this.size = 1;this.left = null;this.right = null;}BalancedNode leftRotate() {int prevSize = size;int currSize = (left != null ? left.size : 0) + (right.left != null ? right.left.size : 0) + count;BalancedNode root = right;right = root.left;root.left = this;root.size = prevSize;size = currSize;return root;}BalancedNode rightRotate() {int prevSize = size;int currSize = (right != null ? right.size : 0) + (left.right != null ? left.right.size : 0) + count;BalancedNode root = left;left = root.right;root.right = this;root.size = prevSize;size = currSize;return root;}}private BalancedNode root;private int size;private Random rand;public BalancedTree() {this.root = null;this.size = 0;this.rand = new Random();}public long getSize() {return size;}public void insert(long x) {++size;root = insert(root, x);}public long lowerBound(long x) {BalancedNode node = root;long ans = Long.MAX_VALUE;while (node != null) {if (x == node.val) {return x;}if (x < node.val) {ans = node.val;node = node.left;} else {node = node.right;}}return ans;}public long upperBound(long x) {BalancedNode node = root;long ans = Long.MAX_VALUE;while (node != null) {if (x < node.val) {ans = node.val;node = node.left;} else {node = node.right;}}return ans;}public int[] rank(long x) {BalancedNode node = root;int ans = 0;while (node != null) {if (x < node.val) {node = node.left;} else {ans += (node.left != null ? node.left.size : 0) + node.count;if (x == node.val) {return new int[]{ans - node.count + 1, ans};}node = node.right;}}return new int[]{Integer.MIN_VALUE, Integer.MAX_VALUE};}private BalancedNode insert(BalancedNode node, long x) {if (node == null) {return new BalancedNode(x, rand.nextInt());}++node.size;if (x < node.val) {node.left = insert(node.left, x);if (node.left.seed > node.seed) {node = node.rightRotate();}} else if (x > node.val) {node.right = insert(node.right, x);if (node.right.seed > node.seed) {node = node.leftRotate();}} else {++node.count;}return node;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Harmony OS 用户通知服务
  • 第三章 LVS+Keepalived群集
  • C++转Java基础知识
  • Python学习笔记50:游戏篇之外星人入侵(十一)
  • RUM技术探索:前端监控数据采集与实践
  • CRITIC权重法
  • c++STL中list介绍,模拟实现和list与vector对比
  • 申请专利需要准备哪些材料?
  • 在Ubuntu 16.04上安装Docker Compose的方法
  • vue的nextTick是下一次事件循环吗
  • 新华三H3CNE网络工程师认证—路由基础
  • springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后
  • AI与PS:技术革命下的设计工具比较
  • 数学建模之数据分析【二】:什么是数据?
  • C语言中整数类型及其类型转换
  • ES6指北【2】—— 箭头函数
  • @angular/forms 源码解析之双向绑定
  • Consul Config 使用Git做版本控制的实现
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • eclipse(luna)创建web工程
  • ES6语法详解(一)
  • Fundebug计费标准解释:事件数是如何定义的?
  • java正则表式的使用
  • passportjs 源码分析
  • spring学习第二天
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 关于使用markdown的方法(引自CSDN教程)
  • 两列自适应布局方案整理
  • 浏览器缓存机制分析
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一份游戏开发学习路线
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 字符串匹配基础上
  • ​【已解决】npm install​卡主不动的情况
  • #1015 : KMP算法
  • #laravel 通过手动安装依赖PHPExcel#
  • #Linux(帮助手册)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (day18) leetcode 204.计数质数
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (算法)区间调度问题
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • .net Application的目录
  • .net 连接达梦数据库开发环境部署
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET的微型Web框架 Nancy
  • .Net多线程Threading相关详解
  • .Net多线程总结
  • // an array of int
  • /bin/bash^M: bad interpreter: No such file or directory
  • :如何用SQL脚本保存存储过程返回的结果集
  • @SpringBootApplication 包含的三个注解及其含义
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042