leetcode 2563. 统计公平数对的数目

news/2025/2/2 20:39:32 标签: leetcode, 算法, c++, 数据结构

题目如下
在这里插入图片描述
数据范围
在这里插入图片描述

显然数组长度最大可以到10的5次方n方的复杂度必然超时,阅读题目实际上就是寻找两个位置不同的数满足不等式即可(实际上i j无所谓是哪个 我们只要把位置小的想成i就行)。
按照上面的思路我们只需要排序数组然后从前往后遍历数组然后利用二分查找寻找下界和上界的下标然后把下标相减就能得到答案。
值得注意的是这样计算会把结果翻倍(假设 1,2满足答案那么按照我们的算法1,2 2,1都会被统计所以结果要减半)

通过代码

class Solution {
public:
    int findlow(vector<int>& nums, int v, int target) {
        int n = nums.size();
        int l = 0, r = n - 1;
        int mid;
        while (l < r) {
            mid = (l + r) / 2;
            if (nums[mid] + v >= target) {
                r = mid;
            } else{
                l = mid + 1;
            }
        }
        if(nums[l] + v < target)return -1;
      //  cout << l;
        return l;
    }
    int findhigh(vector<int>& nums,int v, int target) {
        int n = nums.size();
        int l = 0, r = n - 1;
        int mid;
        while (l < r) {
            mid = (l + r + 1) / 2;
            if (nums[mid] + v > target) {
                r = mid - 1;
            } else{
                l = mid;
            }
        }
        if(nums[l] + v > target)return -1;
        return l;
    }
    long long countFairPairs(vector<int>& nums, int lower, int upper) {
        long long ans = 0;
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int low, high;
        for (int i = 0; i < n; i++) {
            low = findlow(nums,nums[i],lower);
            high = findhigh(nums,nums[i],upper);
            if(low != -1 && high != -1){
                ans += high - low;
              //  cout << low << "-" << high << "\n";
                if(i < low || i > high){
                    ans++;
                }
            }
        }
        return ans/2;
    }
};

在这里插入图片描述


http://www.niftyadmin.cn/n/5840283.html

相关文章

操作系统知识速记:死锁

操作系统知识速记&#xff1a;死锁 什么是死锁&#xff1f; 死锁是指两个或多个进程因争夺资源而造成的一种相互等待的状态&#xff0c;进程间形成循环等待&#xff0c;导致所有进程均无法继续执行。通常情况下&#xff0c;死锁的发生有以下四个必要条件&#xff1a; 互斥条…

Java小白入门教程:封装、继承、多态、重载、重写、抽象、接口

目录 一、封装&#xff08;Encapsulation&#xff09; 基本语法举例 真实实例 二、继承&#xff08;Inheritance&#xff09; 基本语法举例 真实实例 三、多态&#xff08;Polymorphism&#xff09; 基本语法举例 真实实例 四、重载&#xff08;Overloading&#xff0…

蓝桥杯算法笔记|差分学习

&#xff01;前情回顾 前缀和18437蓝桥账户中心 练习代码&#xff1a; #include <iostream> using namespace std; int main() {// 请在此输入您的代码int n,q;cin>>n>>q;int a[n];for(int i0;i<n;i){cin>>a[i];}int sum[n];sum[0]a[0];for(int …

SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?

目录 1 场景描述 1.1 用户行为转移概率矩阵概念 1.2 用户行为转移概率矩阵构建方法 (1) 数据收集

C语言怯魅——指针和数组

C语言怯魅——指针和数组 指针—— C的精华&#xff0c;也是重难点&#xff0c;很多人将C作为入门语言&#xff0c;指针往往成了新手入门编程的拦路虎。 其本质很简单&#xff0c;但由于衍生出来的用法多样&#xff0c;知晓如何以及何时使用指针并不简单。 以下是我个人的一些经…

lstm代码解析1.2

在使用 LSTM&#xff08;长短期记忆网络&#xff09;进行训练时&#xff0c;model.fit 方法的输入数据 X 和目标数据 y 的形状要求是不同的。具体来说&#xff1a; 1. 输入数据 X 的形状 LSTM 层期望输入数据 X 是三维张量&#xff0c;形状为 (samples, timesteps, features)…

upload labs靶场

upload labs靶场 注意:本人关卡后面似乎相比正常的关卡少了一关&#xff0c;所以每次关卡名字都是1才可以和正常关卡在同一关 一.个人信息 个人名称&#xff1a;张嘉玮 二.解题情况 三.解题过程 题目&#xff1a;up load labs靶场 pass 1前后端 思路及解题&#xff1a;…

【Docker】dockerfile识别当前构建的镜像平台

在编写dockerfile的时候&#xff0c;可能会遇到需要针对不同平台进行不同操作的时候&#xff0c;这需要我们对dockerfile进行针对性修改。 比如opencv的依赖项libjasper-dev在ubuntu18.04上就需要根据不同的平台做不同的处理&#xff0c;关于这个库的安装在另外一篇博客里面有…