程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

如何判断是否中奖

如何判断是否中奖

问题描述:

假设开奖结果为:A B C,A、B、C可能相同也可能不同,抽奖结果为:X Y Z,X、Y、Z可能相同也可能不同。如何判断A B C与X Y Z有多少个相同的数字。

本质上是求两个集合的交集。

 

交集操作:

1)  直观的做法:

针对集合2种的每个元素,查找其在集合1种是否出现了,如果出现则纳入集合3。对集合2种的元素操作完后,对得到的集合3进行去重,即为交集。

如果是顺序查找则时间复杂度是O(M*N)——实现1

如果是二分查找,二分查找的前提是排序,则时间复杂度是O(N*logN)或O(M*logM)。

         2)改进的做法:

分别对集合1、2排序,顺序扫描,进行判断,对匹配的元素纳入交集。由于需要排序,所以时间复杂度为O(N*logN)或O(M*logM)——实现2

 

实现:

1)  顺序查找

// 实现1
#include <iostream>
#include <vector>
#include <set>
#include <cstring>
using namespace std;

int inter(const vector<char>& set1, const vector<char>& set2, set<char>& set3)
{
    // 因为是顺序查找,所以不用计较 set1 和 set2 的顺序
    // 如果是二分查找,则要考虑二者的顺序,如果 set1.size() > set2.size()
    // 则 for set2, find set1;
    // 时间复杂度为 O(set2.size()*log(set1.size())) < O(set1.size()*log(set2.size()))
    // 如果 set1.size() < set2.size()
    // 则 for set1, find set2; 
    // 时间复杂度为 O(set1.size()*log(set2.size())) < O(set2.size()*log(set1.size()))
    set3.clear();
    for (vector<int>::size_type i = 0; i != set1.size(); ++i)
    {
        for (vector<int>::size_type j = 0; j != set2.size(); ++j)
        {
            if (set1[i] == set2[j])
            {
                set3.insert(set1[i]);
            }
        }
    }
    return set3.size();
}

int main()
{
    char a[] = "abcdefg";
    char b[] = "abcxxfg";
    // char a[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
    // char b[] = {'a', 'b', 'c', 'x', 'x', 'f', 'g'};
    vector<char> set1(a, a+strlen(a));
    vector<char> set2(b, b+strlen(b));
    
    set<char> set3;
    inter(set1, set2, set3);
    
    for (set<char>::const_iterator cit = set3.begin(); cit!= set3.end(); ++cit)
    {
        cout << *cit << ' ';
    }
    cout << endl;
    system("PAUSE");
    return 0;
}

 

2)  先排序后扫描

// 实现2
#include <iostream>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
using namespace std;

int inter_2(const vector<char>& seta, const vector<char>& setb, vector<char>& set3)
{
    set3.clear();
    vector<char> set1(seta);
    vector<char> set2(setb);
    sort(set1.begin(), set1.end());
    sort(set2.begin(), set2.end());
    for (int i = 0, j = 0; i != set1.size() && j != set2.size();)
    {
        if (set1[i] == set2[j])
        {
            set3.push_back(set1[i]);
            ++i;
            ++j;
        }
        else if (set1[i] < set2[j])
        {
            ++i;
        }
        else
        {
            ++j;
        }
    }
    return set3.size();
}

int main()
{
    char a[] = "abcdefg";
    char b[] = "abcxxfg";
    // char a[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
    // char b[] = {'a', 'b', 'c', 'x', 'x', 'f', 'g'};
    vector<char> set1(a, a+strlen(a));
    vector<char> set2(b, b+strlen(b));
    
    vector<char> set3;
    inter_2(set1, set2, set3);
    
    for (vector<char>::const_iterator cit = set3.begin(); cit!= set3.end(); ++cit)
    {
        cout << *cit << ' ';
    }
    cout << endl;
    system("PAUSE");
    return 0;
}

posted on 2013-06-20 22:45  unixfy  阅读(334)  评论(0编辑  收藏  举报

导航