zoukankan      html  css  js  c++  java
  • 算法导论 练习题 2.37

    [淘宝笔试题,哪年出的题不记得了]

    请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素?

    1、先对数组排序,然后利用折半查找实现。

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void sort(int a[],int size)
     5 {
     6     // 直接插入排序
     7     int key =0;
     8     for(int i=1;i<size;++i)
     9     {
    10         key = a[i];
    11         int j;
    12         for(j=i-1;j>=0;--j)
    13         {
    14             if(a[j] > a[key]) 
    15                 a[j+1] = a[j];
    16             else
    17                 break;
    18         }
    19         a[j+1] = key;
    20     }
    21 }
    22 bool b_query(int a[],int size,int _x)
    23 {
    24     int low = 0;
    25     int high = size-1;
    26     int key = _x;
    27     while(low <= high)
    28     {
    29         int mid = (low+high)/2;
    30         if(a[mid] == key) return true;
    31         if(a[mid] < key) 
    32             low = mid + 1; 
    33         else if(a[mid] > key)
    34             high = mid - 1;
    35     }
    36     return false;
    37 }
    38 bool query_x(int a[],int size,int x)
    39 {
    40     sort(a,size);
    41     for(int i=0;i<size;++i)
    42     {
    43         if(true == b_query(a,size,x-a[i]))
    44             return true;
    45     }
    46     return false;
    47 }
    48 void main()
    49 {
    50     int a[] = {-10,10,5,9,-90,30,8,7,4,3};
    51     int x;
    52     cin >> x;
    53     if(true == query_x(a,10,x))
    54         cout << " 找到" <<endl;
    55     else
    56         cout << "未找到" << endl;
    57 
    58 }

    2、利用hash_set实现

     1 #include <iostream>
     2 #include <hash_set>   // 注意要使用hash_set时,需要关联的头文件的格式
     3 #include <algorithm>    
     4 using namespace std;
     5 using namespace stdext;  // 注意要使用hash_set时,需要关联的命名空间格式  
     6 
     7 bool query_x(int a[],int size,int x)
     8 {
     9     hash_set<int> haset;
    10     for(int i=0;i<size;++i)
    11         haset.insert(haset.end(),a[i]);
    12     for(int i=0;i<size;++i)
    13     {
    14         hash_set<int>::iterator ip;
    15         ip = find(haset.begin(),haset.end(),x-a[i]); // 时间复杂度是O(1)
    16         if(ip != haset.end())
    17             return true;
    18     }
    19     return false;
    20 }
    21 void main()
    22 {
    23     int a[] = {-10,10,5,9,-90,30,8,7,4,3};
    24     int x;
    25     cin >> x;
    26     if(true == query_x(a,10,x))
    27         cout << " 找到" <<endl;
    28     else
    29         cout << "未找到" << endl;
    30 
    31 }
  • 相关阅读:
    常用图书下载
    模式另类说明
    windows进程中的内存结构
    Windows API学习手记
    20060318工作记录
    X3全局变量及公共函数所在的命名空间说明
    PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
    php随机生成指定长度的字符串 可以固定数字 字母 混合
    以div代替frameset,用css实现仿框架布局
    核中汇编写的字符串函数代码分析
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2443594.html
Copyright © 2011-2022 走看看