GEEK编程练习— —两数求和

题目

输入一个特定整数值和一组整数,要求从这组整数中找到两个数,使这两数之和等于特定值。按照从前往后的顺序,输出所有满足条件的两个数的位置。具体格式如下:

输入

9
1 2 4 5 7 9 11 

输出

2 5
3 4

分析

1)暴力解法,复杂度O(n^2),不考虑

2)hash。用哈希表存储每个数对应下标,复杂度O(n)

3)先排序,然后左右夹逼,排序O(nlogn),夹逼O(n),最终O(nlogn)。但是需要的是位置,而不是数字本身,此方法不适用。

代码

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

int main()
{
    vector<int> nums;
    int target;
    int tmp;
    cin >> target;
    while (cin >> tmp)
        nums.push_back(tmp);

    unordered_map<int, int> mapping;
    vector<int> result;
    for (auto i = 0; i < nums.size(); ++i)
    {
        mapping[nums[i]] = i;
    }

    for (auto i = 0; i < nums.size(); ++i)
    {
        const int gap = target - nums[i];
        if (mapping.find(gap) != mapping.end() && mapping[gap] > i)
        {
            result.push_back(i + 1);
            result.push_back(mapping[gap] + 1);
        }
    }

    for (auto i = 0; i < result.size(); i += 2)
    {
        cout << result[i] << ends << result[i + 1] << endl;
    }
    return 0;
}
时间: 2024-08-07 19:44:35

GEEK编程练习— —两数求和的相关文章

GEEK编程练习— —四数求和

题目 输入一个特定整数s和一组整数,要求从这组整数中找到四个数a,b,c,d,使a+b+c+d=s.按照升序排列,输出所有满足条件的a,b,c,d.具体格式如下: 输入 0 1 0 -1 0 -2 2 输出 -2 -1 1 2 -2 0 0 2 -1 0 0 1 分析 先排序,可以用hashmap缓存两个数的和,然后左右夹逼,时间复杂度O(n^2),空间复杂度O(n^2) 代码 #include <iostream> #include <vector> #include <u

GEEK编程练习— —三数求和

题目 输入一个特定整数s和一组整数,要求从这组整数中找到三个数a,b,c,使a+b+c=s.按照升序排列,输出所有满足条件的a,b,c.具体格式如下: 输入 0 -1 0 1 2 -1 -4 输出 -1 -1 2 -1 0 1 分析 先排序,然后左右夹逼,复杂度O(n^2) 此方法可以推广到k个数求和,先排序,做k-2次循环,在最内层循环左右夹逼,时间复杂度O(max(nlogn,n^(k-1))) 代码 #include <iostream> #include <vector>

算法——两数求和

题目 给定一个整数数组nums 和 一个目标值target,请你在数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2,7,11,15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0,1] 思路: 两次轮询,两两相加 一次轮询,对比差值 解答 方法一: /// <summary> /// 方法一:暴力破解法 ///

编程题:求两数之和

#include<stdio.h>       /*包含输入输出头文件*/ main()                            /*定义主函数*/ {  int a,b,sum;                /*定义整数变量a.b.sum*/ a=123;                        /*给a赋值*/ b=456;                        /*给b赋值*/ sum=a+b;                  /*令sum=a+b*/ p

C语言与汇编的嵌入式编程:汇编调用函数(两数交换)

编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b= temp; //printf("a=%d,b=%d,temp=%d\n",a,b,temp); } void main(){ int a=0; int b=0; char *str1="a=%d,b=%d\n"; printf("++++++\

两数二进制bit位不同个数

1.编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? #include<stdio.h> #include<string.h> int bits_compare(int num1,int num2) { int a[32]={0}; int b[32]={0}; int i=0; int count=0; for(i=0;i<32;i++)//num1 二进制转化 { a[i]=num1%2; num1=num1/2; } printf(&q

找出数组中两数之和为指定值的所有整数对

一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一: 先将整型数组排序,排序之后定义两个指针left和right.left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素 将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--:若前者小,left++:若相等,则找到了一对整数之和为指定值的元素

华为机试4[编程题] 删数

[编程题] 删数 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置.以8个数 (N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)-> 6->7->0(删除),如此循环直到最后一个数被删除. 输入描述: 每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算. 输出描述: 一行输出最后一

LeetCode——两数之和

最近在家拧三阶魔方,把初级的玩法掌握了,也就是可以还原六个面了,速度不快,但是也很兴奋.三阶魔方的初级玩法按照套路拧就可以了,每一步需要完成的任务,该步骤转动的方法基本都是固定的,而且变化也并不是特别多.只要按照套路多练习,不考虑速度的情况下还原一个三阶魔方还是很容易的. 编程入门和还原魔方其实差不多,最初也是掌握套路后反复的练习,先从一个生手变成一个熟手,然后再去提高.分享一个段子,在知乎上看到的,如下: 陈康肃公尧咨善射,当世无双,公亦以此自矜.尝射于家圃,有卖油翁释担而立,睨之,久而不去.