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

2563.统计公平数对的数目 是否顺序无关?

2563.统计公平数对的数目

在这里插入图片描述
在这里插入图片描述

  • 观察这个数据的范围,虽然数据范围很大,但是一共就只有10^5个数字,可以考虑通过离散化把数字的范围控制在3*10^5,但是对于原来的形式lower <= nums[i] + nums[j] <= upper,对于一个nums[j]来说,就得考虑前面的所有的nums[j]的情况,在这里有一个方法,那就是树状数组,用一个值域树状数组用于统计这个区间和,但是发现还是无法避免需要一个个统计nums[i],i<j的情况
  • 那么是否可以通过排序,使用二分的算法进行求解?o(nlong),我们通过将公式变形,去证明这个公式是顺序无关的
  • 观察这个原来的形式
        # lower <= nums[i] + nums[j] <= upper
  • 原本的形式是求解在这个nums[j]的时候,需要一个个枚举前面的nums[i]的情况
    可以通过移项得到:
        #公式1 lower - nums[i] <= nums[j] <= upper - nums[i]#公式2 lower - nums[j] <= nums[i] <= upper - nums[j]
  • 这样求解的形式就分开来了,虽然有要求这个i<j,但是这个形式就算是我们求解当前的是nums[j],它的贡献值是前面的i<j的全部满足公式1的情况,当然前后是相对的,它对后面的贡献值是满足公式2的全部情况,所以,综合考虑,这个题目的本质只是统计出两个不同位置满足这个公式的数对,所以是顺序无关的
import bisect
class Solution:def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:# 二分的思路# 转换公式的形式之后,你会发现这是一个顺序无关的问题?为什么?下面的公式是对于i,j都是一样的,也就是只用选出两个数即可# lower - nums[i] <= nums[j] <= upper - nums[i]# lower - nums[j] <= nums[i] <= upper - nums[j]nums.sort()ans = 0for i,num in enumerate(nums):indexl = bisect.bisect_left(nums,lower-num,0,i)index2 = bisect.bisect_right(nums,upper-num,0,i)ans += index2 - indexlreturn ans 

相关文章:

  • 利用 Deepseek 和 Mermaid 画流程图
  • 软件开发指南——GUI 开发方案推荐
  • LeetCode --- 154双周赛
  • 当算力遇上马拉松:一场科技与肉身的极限碰撞
  • JSAPI2.1-DOM基础
  • 【网络技术_域名解析DNS】三、DNS 中间件实践应用与优化策略
  • Linux系统中的网络传输、网络管理以及软件仓库的构建
  • CSS层叠
  • 【java实现+4种变体完整例子】排序算法中【插入排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • CasualLanguage Model和Seq2Seq模型的区别
  • 游戏引擎学习第236天:GPU 概念概述
  • 基于STM32中断讲解
  • 【蓝桥杯 2025 省 A 扫地机器人】题解
  • QML动画--ParticleSystem
  • 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读
  • opencv--基础
  • 【数据结构】励志大厂版·初阶(复习+刷题)单链表
  • PHP框架在大规模分布式系统中的适用性如何?
  • 【Linux我做主】make和makefile自动化构建
  • 【25软考网工笔记】第二章(6)脉冲编码调制PCM、通信和交换方式
  • “很多中国企业竞争力独一无二”,这场对接会上他频频为协同供应链点赞
  • 中国泳协:新奥运周期竞争激烈,“三从一新”全力提升实力
  • 龚正会见巴西里约热内卢州州长克劳迪奥·卡斯特罗
  • 税率飙至3500%!美国双反大棒重击东南亚光伏,中企如何应对
  • 新增1839个!2024年度本科专业备案和审批结果,公布
  • 上海农房翻建为何难?基层盼政策适度松动