zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第17章:普通题——题目12

    2014-04-29 00:04

    题目:给定一个整数数组,找出所有加起来为指定和的数对。

    解法1:可以用哈希表保存数组元素,做到O(n)时间的算法。

    代码:

     1 // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target.
     2 // Use hash to achieve O(n) time complexity. Duplicates pairs are skipped.
     3 #include <cstdio>
     4 #include <unordered_map>
     5 #include <vector>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     vector<int> v;
    11     unordered_map<int, int> um;
    12     int n, i;
    13     int x, y;
    14     int target;
    15     
    16     while (scanf("%d", &n) == 1 && n > 0) {
    17         scanf("%d", &target);
    18         
    19         v.resize(n);
    20         for (i = 0; i < n; ++i) {
    21             scanf("%d", &v[i]);
    22         }
    23         
    24         // duplicate pairs are skipped
    25         for (i = 0; i < n; ++i) {
    26             um[v[i]] = um[v[i]] + 1;
    27         }
    28         
    29         unordered_map<int, int>::iterator it, it2;
    30         for (it = um.begin(); it != um.end(); ++it) {
    31             x = it->first;
    32             y = target - x;
    33             if (x > y) {
    34                 continue;
    35             }
    36             
    37             --it->second;
    38             if ((it2 = um.find(y)) != um.end() && it2->second > 0) {
    39                 printf("(%d, %d)
    ", x, y);
    40             }
    41             ++it->second;
    42         }
    43         
    44         v.clear();
    45         um.clear();
    46     }
    47     
    48     return 0;
    49 }

    解法2:先将数组排序,然后用两个iterator向中间靠拢进行扫描。总体时间是O(n * log(n))。

    代码:

     1 // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target.
     2 // O(n * log(n) + n) solution.
     3 #include <algorithm>
     4 #include <cstdio>
     5 #include <vector>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     vector<int> v;
    11     int n, i;
    12     int ll, rr;
    13     int target;
    14     
    15     while (scanf("%d", &n) == 1 && n > 0) {
    16         scanf("%d", &target);
    17         
    18         v.resize(n);
    19         for (i = 0; i < n; ++i) {
    20             scanf("%d", &v[i]);
    21         }
    22         sort(v.begin(), v.end());
    23         ll = 0;
    24         rr = n - 1;
    25         
    26         int sum;
    27         while (ll < rr) {
    28             sum = v[ll] + v[rr];
    29             if (sum < target) {
    30                 while (ll + 1 < rr && v[ll] == v[ll + 1]) {
    31                     ++ll;
    32                 }
    33                 ++ll;
    34             } else if (sum > target) {
    35                 while (rr - 1 > ll && v[rr] == v[rr - 1]) {
    36                     --rr;
    37                 }
    38                 --rr;
    39             } else {
    40                 printf("(%d, %d)
    ", v[ll], v[rr]);
    41                 while (ll + 1 < rr && v[ll] == v[ll + 1]) {
    42                     ++ll;
    43                 }
    44                 ++ll;
    45             }
    46         }
    47         
    48         v.clear();
    49     }
    50     
    51     return 0;
    52 }
  • 相关阅读:
    python基础学习-day13==课后作业练习(函数的基本使用)
    python基础学习-函数的基本使用
    python基础学习-day12==课后作业练习(文件指针的控制操作)
    python基础学习-文件其他操作模式(补充)
    python基础学习-day11==课后作业练习(文件操作)
    python基础学习-文件处理
    简单页面设计
    前端.浮动.定位框
    css属性and盒模型
    用html搭建一个注册页面
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3698310.html
Copyright © 2011-2022 走看看