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

网页设计免费网站推荐微软做网站

网页设计免费网站推荐,微软做网站,南宁网站建设推广优化,网站宣传费用2563. 统计公平数对的数目 题目 问题分析 输入&#xff1a;一个整数数组 nums 和两个整数 lower 和 upper。 输出&#xff1a;返回满足条件的公平数对的数目&#xff0c;即对于所有 0 < i < j < n&#xff0c;lower < nums[i] nums[j] < upper 的数对 (i, j)…

2563. 统计公平数对的数目

题目

在这里插入图片描述

问题分析

输入:一个整数数组 nums 和两个整数 lower 和 upper。
输出:返回满足条件的公平数对的数目,即对于所有 0 <= i < j < n,lower <= nums[i] + nums[j] <= upper 的数对 (i, j) 的数量。

思路

方法一:暴力解法(时间复杂度 O(n^2))
直接遍历所有可能的数对 (i, j) 并检查它们是否满足条件。
方法二:优化解法(二分查找)
排序:首先对数组 nums 进行排序。
遍历:然后对每个 nums[i],使用 二分查找 来找到满足条件的 nums[j](其中 j > i)的范围。
二分查找:分别找到满足 nums[i] + nums[j] <= upper 的最大 j(通过 find_upper_bound)和满足 nums[i] + nums[j] >= lower 的最小 j(通过 find_lower_bound)。

代码

class Solution:def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:# 对数组进行排序nums.sort()count = 0n = len(nums)for i in range(n):# 找到满足 nums[i] + nums[j] <= upper 的最大 j 的位置r = self.find_upper_bound(nums, upper - nums[i], i + 1, n - 1)# 找到满足 nums[i] + nums[j] >= lower 的最小 j 的位置l = self.find_lower_bound(nums, lower - nums[i], i + 1, n - 1)# 统计符合条件的数对数量if l <= r:count += r - l + 1return countdef find_upper_bound(self, nums, target, start, end):while start <= end:mid = (start + end) // 2if nums[mid] > target:end = mid - 1else:start = mid + 1return enddef find_lower_bound(self, nums, target, start, end):while start <= end:mid = (start + end) // 2if nums[mid] < target:start = mid + 1else:end = mid - 1return start

复杂度分析

时间复杂度:
排序:(O(n \log n))
遍历并二分查找:(O(n \log n))
因此,最终时间复杂度为:
[ O(n \log n) + O(n \log n) = O(n \log n) ]
空间复杂度:
遍历:(O(n))

学习

排序

排序是为了后续能够利用 二分查找 来高效地找到满足条件的 nums[j]。

遍历

for i in range(n):r = self.find_upper_bound(nums, upper - nums[i], i + 1, n - 1)l = self.find_lower_bound(nums, lower - nums[i], i + 1, n - 1)if l <= r:count += r - l + 1

遍历每个 nums[i]:对于每个 nums[i],我们需要找到所有 j > i 且满足 lower <= nums[i] + nums[j] <= upper 的 nums[j]。
找到 r 和 l:
r 是满足 nums[i] + nums[j] <= upper 的最大 j 的位置。
l 是满足 nums[i] + nums[j] >= lower 的最小 j 的位置。
统计数对:如果 l <= r,则 l 到 r 之间的所有 j 都是符合条件的,因此数对数量为 r - l + 1。

二分查找

find_upper_bound:找到第一个大于 target 的元素的位置(返回该位置的前一个位置)。

  def find_upper_bound(self, nums, target, start, end):while start <= end:mid = (start + end) // 2if nums[mid] > target:end = mid - 1else:start = mid + 1return end

find_lower_bound:找到第一个不小于 target 的元素的位置。

  def find_lower_bound(self, nums, target, start, end):while start <= end:mid = (start + end) // 2if nums[mid] < target:start = mid + 1else:end = mid - 1return start

与相向双指针方法的区别

相向双指针方法 的典型特点是:
两个指针从两端向中间移动:一个指针从数组的起始位置开始(left),另一个指针从数组的末尾位置开始(right)。
根据当前 nums[left] + nums[right] 的值来决定移动哪个指针:
如果当前和小于 lower,则 left 指针右移。
如果当前和大于 upper,则 right 指针左移。
如果当前和在 [lower, upper] 范围内,则统计符合条件的数对并调整指针。

http://www.dtcms.com/wzjs/553269.html

相关文章:

  • wordpress菜单背景半透明南京seo外包
  • 广州做网站商城的公司虚拟机做网站服务
  • 高清网站推广免费下载学院宣传网站建设简介
  • 北京市住房与城乡建设厅网站刷单网站开发
  • 莲湖微网站建设天空台108网站找手工活带回家做
  • 医疗产品网站建设wordpress产品定制插件
  • 公司网站邮箱怎么看接收服务器类型关于手机网站设计的若干想法
  • php网站开发实训报告书建设简易电子商务网站流程
  • 怎么做商城网站平谷重庆网站建设
  • 南昌微网站建设免费网站推广工具有哪些
  • 推广单页网站免费制作在手机上怎么做app软件
  • 无锡网站制作哪家便宜网站案例演示
  • 晋江市建设局网站永久免费自动建站系统
  • 做微信小程序和做网站网站浏览器兼容
  • 电商网站开发背景怎么写xx汽车企业网站和信息化建设
  • 建站 哪个网站系统好用丰台建设企业网站
  • 买空间服务器做网站怎么弄如何制作境外网站
  • 陕西网站建设优化建站外贸营销型网站设计
  • 做的好点的外贸网站有哪些wordpress 排版代码
  • 专业番禺网站建设网站建设与制
  • 北京公司网站建设定沧州百胜信息技术有限公司
  • 手机网站免费空间西宁网站建设报价壹君博贴心
  • 网上询价九幺seo工具
  • 农资网站建设如何制作小程序商城
  • 苏州网站建设运营推广网站做好了怎么办
  • 做零食网站的选题理由哈尔滨专业建网站哪家好
  • 手机网站建设软件有哪些内容网站备案核实
  • 手机qq钓鱼网站怎么做常州网站搭建找哪家
  • 阿里云做网站用哪个镜像正定县住房和城乡建设局网站
  • 南山网站建设公司株洲网上购房节