和为k

输出多组: https://www.cnblogs.com/fangzheng-nie/articles/9770397.html

描述

给出若干个整数,询问其中是否有一对数的和等于给定的数。

输入共三行:
第一行是整数n(0 < n <= 100,000),表示有n个整数。
第二行是n个整数。整数的范围是在0到10^8之间。
第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和。输出若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。样例输入

4
2 5 1 4
6

样例输出

1 5
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<math.h>
#include<cstdio>
using namespace std;
int a[100000];
int main()
{	
    int n,m,l,r,mid;
    cin>>n; 
    for(int i=0;i<n;i++)
    cin>>a[i];
    cin>>sum;   
    sort(a,a+n);//对输入的所有数进行排序 方便找到最小的那个符合条件的
    for(int i=0;i<n;i++)//从第一个元素开始找
    {
    	l=i+1;//左界
	r=n-1;//右界
    	while(l<=r)
    	{
    		mid = (l+r)/2;
    		if(a[i]+a[mid]==sum)    //如果此时中间的数和a【i】加起来正好是m直接输出并且return 0
    		{
    			cout<<a[i]<<" "<<a[mid];
    			break;
		}
		 else if(a[mid]+a[i]>sum) 
r=mid-1;//如果偏大就往左找 else
l=mid+1;//否则往右边找 } } cout<<"No"; //到这时说明上面没找到符合条件的 输出no就可以了 }

  

 

转载于:https://www.cnblogs.com/fangzheng-nie/p/9997499.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述: 给定一个长度为n的整数序列,请你找出和为k的不同的数对。 输入格式: 第一行包含两个整数n和k,表示整数序列的长度以及给定的和。 第二行包含n个整数,表示整数序列。 输出格式: 输出所有满足条件的数对,每行包含两个整数,表示找到的数对。 输出顺序任意,但不能重复,即对于两个下标i,j(i<j),不考虑输出顺序,当且仅当i1=i,j1=j时,认为两个数对重复。 数据范围: 1≤n≤1000, −109≤Si≤109, −109≤k≤109。 输入样例: 5 6 1 2 3 2 5 输出样例: 1 5 2 4 3 3 解题思路: 使用哈希表,将每个数出现的次数记录下来,然后遍历哈希表,对于每个数,判断k与该数的差值是否在哈希表中出现过,如果出现过,就说明存在一对数的和为k。 需要注意的是,如果k是偶数,那么只需要判断k/2这个数是否出现过即可,因为另一个数就是k/2,如果k是奇数,那么就需要判断k/2和k/2+1这两个数是否出现过。 C++ 代码 ### 回答2: 这道题目的意思是给定一个整数数组和一个整数k,要求找出其中所有和为k的数,并统计数量。要求我们使用算法解决这个问题。接下来,我将介绍一种解决此问题的方法。 首先,我们可以使用双重循环遍历数组中的每个数字,然后再把数组中其他的数字和它相加,看看是否等于k。但是这种方法的时间复杂度为O(n^2),时间效率比较低,当数组比较大时,会导致程序运行的非常缓慢。 我们可以考虑使用哈希表来解决这个问题,哈希表是一种高效的数据结构,可以实现O(1)的查找和插入操作。具体的算法步骤如下: 1. 创建一个空的哈希表table,用于存储数组中的每个数字以及它出现的次数。 2. 遍历整个数组,对于数组中的每个数字,查找它需要与哪个数字相加才能得到k。假设当前数字为num,需要找到的数字为target = k - num。 3. 判断target是否存在于哈希表table中,如果存在,则说明当前数字和target的和等于k,统计它们出现的次数。如果不存在,则将当前数字num以及它出现的次数插入到哈希表table中。 4. 遍历完整个数组后,我们就可以得到所有和为k的数字,并统计它们出现的次数。 下面是使用Python实现上述算法的代码: def findSum(arr, k): table = {} count = 0 for num in arr: target = k - num if target in table: count += table[target] table[num] = table.get(num, 0) + 1 return count arr = [1, 2, 3, 4, 5, 6, 7] k = 7 print(findSum(arr, k)) 以上代码的时间复杂度为O(n),是一种高效的解决方案。在处理大量数据时,这种方法比暴力双重循环的方法要快得多。 ### 回答3: 题目描述 给定一个长度为n的整数序列a1,a2,...,an以及一个整数k,请问有多少个不同的二元组(i,j)(1<=i<=j<=n),使得ai+ai+1+...+aj=k? 输入格式 第一行包含两个整数n和k。 第二行包含n个整数,表示整数序列。 输出格式 输出一个整数,表示符合条件的二元组数目。 思路分析 暴力枚举:首先我们可以暴力枚举所有的二元组 (i, j),然后计算 ai+ai+1+...+aj 的值是否等于给定的 k,时间复杂度为 O(n^2)。 前缀和优化:我们可以把暴力枚举中的 ai+ai+1+...+aj 转化为前缀和的形式,即 prefix[j]-prefix[i-1],其中 prefix[i] 表示前缀和,可通过一个前缀和数组辅助实现。这样时间复杂度就降为 O(n)。 代码实现 以下是前缀和优化的算法实现,具体注释见代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值