7-8 三足鼎立

文章介绍了如何通过使用哈希表和二分查找算法优化两层循环的时间复杂度,解决边界条件问题,避免暴力求解导致的超时,专注于在有序序列中找到满足特定条件的数

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
int main() {
    ll n, m; cin >> n >> m;
    vector<int>mp;
    for (ll i = 0; i < n; i++) {
        ll x; cin >> x; mp.emplace_back(x);
    }
    sort(mp.begin(), mp.end());
    ll left, right;
    ll sum = 0;
    for (ll i = 0; i < n; i++) {
        ll l = i + 1,r = n - 1;
        if (l > r)break;//最后一次l>r 会多计算一次 退出
        ll Min = abs(m - mp[i]), Max = m + mp[i];
        while (l <= r) {//找Min 添两个等号 为了找离Min最近并且大于Min的数
            ll mid = (l + r) / 2;
            if (mp[mid] <= Min) {
                l = mid + 1;
            }
            else r = mid - 1;
        }
        r = n - 1; left = l;
        while (l <= r) {//找Max
            ll mid = (l + r) / 2;
            if (mp[mid] >= Max) {
                r = mid - 1;
            }
            else l = mid + 1;
        }
        right = r;
        sum += right - left + 1;//加1能补回来
    }
    cout << sum;
    return 0;
}


1.两层for循环时间的优化
哈希表查找时间为O(1)
二分法优化时间

2.边界条件 找离Min最近并且比Min大 所以循环条件两个=
                  找离Max最近并且比Max小 所以循环条件两个=

3.暴力会超时
 

4.思考

二分查找是找一个数,通过升序序列 每次找中间的来规划范围

找Min a[mid]<=Min l=mid+1 else r=mid-1;

找离Min最近并且比Min大的数

while(l<=r) a[mid]<=mid  l=mid+1 (等于Min的时候l就会+1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值