zoukankan      html  css  js  c++  java
  • acwing_800_数组元素的目标和

    800. 数组元素的目标和

    给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。
    请你求出满足A[i] + B[j] = x的数对(i, j)。

    数据保证有唯一解。

    输入格式

    第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。

    第二行包含n个整数,表示数组A。

    第三行包含m个整数,表示数组B。

    输出格式

    共一行,包含两个整数 i 和 j。

    数据范围

    数组长度不超过100000。
    同一数组内元素各不相同。
    11091≤数组元素≤109

    输入样例:

    4 5 6
    1 2 4 7
    3 4 6 8 9
    

    输出样例:

    1 1


    思想:这到题目需要用到双指针的算法,用一个指针i指向数组a,用另一个指针j指向数组b,我们需要找到的是当a[i] + a[j] = x 的i与j
    那么当我们找到i对应的j的范围(a[i] + b[j] < x )为【1,di]时,那么i + 1 指针所对应的j也一定在[1,di]这个范围类,所以当我们去寻找j的时候
    可以使用二分去找,这样我们算法的总体的时间复杂度就为:nlogn,
    AC代码:
    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int maxn = 1e5 + 5;
    int a[maxn], b[maxn];
    
    inline void read(int &w) {
         char c = getchar();
         w = 0;
         int reg = 1;
         while(c < '0' || c > '9') {
             if(c == '-') reg = -1;
             c = getchar();
         }
         while(c >= '0' && c <= '9') {
             w = w * 10 + c - '0';
             c = getchar();
         }
         
        w *= reg;
    }
    
    inline int binary_sort(int l, int r, int x, int y) {
        while(l < r) {
            int mid = (l + r + 1) / 2;
            if(x + b[mid] <= y) l = mid;
            else r = mid - 1;
        }
        
        return l;
    }
    
    int main(void) {
    //    freopen("in.txt", "r", stdin);
        
        register int n, m, x;
        read(n), read(m), read(x);
        for(int i = 1; i <= n; i ++) read(a[i]);
        for(int i = 1; i <= m; i ++) read(b[i]);
        
        int i = 1, j = 1, di = m, x1, x2, flag = 0;
        for(i = 1; i <= n; i ++) {
            int tmp = binary_sort(1, di, a[i], x);
            if(a[i] + b[tmp] == x) { x1 = i, x2 = tmp; break; }
            else di = tmp;
        }
        
        printf("%d %d
    ", x1 - 1, x2 - 1);
        
        
    //    fclose(stdin);
        return 0;
    }
  • 相关阅读:
    vue 循环Redio
    vue 子组件修改父组件变量问题
    docker安装redis
    vue 复制内容到粘贴板
    vue 组件传值
    vscode 打开多个标签页
    asp.net 文件分片上传
    css之图片下方定位遮掩层
    Python发送邮件脚本
    git添加秘钥提示Key is already in use
  • 原文地址:https://www.cnblogs.com/phaLQ/p/11106009.html
Copyright © 2011-2022 走看看