zoukankan      html  css  js  c++  java
  • 两数组中寻找两个数的某种关系

    寻找幸运数字

    ★实验任务

    给出两个已按升序排列的数组 a[1..n],b[1..m],如果存在 i,j,使得 a[i]+b[j]==k,我们便说已找到幸运值。请你判断能不能找到幸运值。

    ★数据输入

    输入第一行为正整数 n,m,k。(1<=k<=10^9) 第二行为 n 个正整数 a[1..n]。(1<=ai<=10^9) 第三行为 m 个正整数 b[1..m]。(1<=bi<=10^9) 80%的数据 1<=n,m<=1000. 100%的数据 1<=n,m<=100000.

    ★数据输出

    如果能找到幸运值,输出 yes。否则输出 no。

    测试样例

    输入:

    3 3 8

    1 2 3

    4 6 7

    输出:yes

    解题思路:首先看题暴力求解的复杂度肯定是n2会超时的,然后就可以根据题目中给的另一个小提示两个数列都是升序排列进行优化,升序哦哎lie显然就很容易想到通过二分法可以查找,然后把暴力两个数组都遍历一遍就可以优化成:对一个数组进行遍历,另一个数通过二分法查找,复杂度就可以降到nlogn,就可以解题了。另外一种思路就是根据两个数组都是升序的,通过两个标识(指针)分别从前往后同步对两个数组进行遍历,复杂度是m+n;

    代码:

     
                #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    
    using namespace std;
    
    int a[100005], b[100005];
    
    int main()
    {
    	int n, m, k, i, j;
    	int ok = 0;
    	cin >> n >> m >> k;
    	for (i = 0; i < n; i++)cin >> a[i];
    	for (i = 0; i < m; i++)cin >> b[i];
    	i = 0, j = m-1;
    	if (a[n - 1] + b[m - 1]<k || a[0] + b[0]>k)
    		ok = 0;
    	else
    	{
    		while (i <= n - 1 && j >= 0)
    		{
    			if(a[i]+b[j]>k)
    			{
    				j--; continue;
    			}
    			else if(a[i]+b[j]<k)
    			{
    				i++; continue;
    			}
    			else
    			{
    				ok = 1; break;
    			}
    		}
    	}
    	if (ok == 1)cout << "yes" << endl;
    	else cout << "no" << endl;
    	return 0;
    }
            
    
  • 相关阅读:
    C++中substr函数的用法
    最小生成树-克鲁斯卡尔模板
    最小生成树-prim算法模板
    1064. 朋友数(20)
    1076. Wifi密码 (15)【模拟】
    二分搜索与二分答案
    HDU 1969 Pie【二分】
    1047. 编程团体赛(20)
    1057. 数零壹(20)
    L2-3. 悄悄关注【STL+结构体排序】
  • 原文地址:https://www.cnblogs.com/heihuifei/p/7813857.html
Copyright © 2011-2022 走看看