【程序员面试金典】20180801

题目描述

现有一些随机生成的数字要将其依次传入,请设计一个高效算法,对于每次传入一个数字后,算出当前所有传入数字的中位数。(若传入了偶数个数字则令中位数为第n/2小的数字,n为已传入数字个数)。

给定一个int数组A,为传入的数字序列,同时给定序列大小n,请返回一个int数组,代表每次传入后的中位数。保证n小于等于1000。

测试样例:

[1,2,3,4,5,6],6
返回:[1,1,2,2,3,3]
class Middle {
public:
    vector<int> getMiddle(vector<int> A, int n) {
        // write code here
        vector<int> maxheap;
        vector<int> minheap;
        vector<int> re;
        for(int i=0;i<n;++i)
            {
            if(maxheap.size()==minheap.size())
                {
                if(minheap.size()>0&&minheap.front()<A[i])
                    {
                    pop_heap(minheap.begin(),minheap.end(),greater<int>());
                    maxheap.push_back(minheap.back());
                    push_heap(maxheap.begin(),maxheap.end(),less<int>());
                    minheap.pop_back();
                     
                    minheap.push_back(A[i]);
                    push_heap(minheap.begin(),minheap.end(),greater<int>());
                }
                else
                    {
                    maxheap.push_back(A[i]);
                    push_heap(maxheap.begin(),maxheap.end(),less<int>());
                }
            }
            else
                {
                if(maxheap.front()>A[i])
                    {
                    pop_heap(maxheap.begin(),maxheap.end(),less<int>());
                    minheap.push_back(maxheap.back());
                    push_heap(minheap.begin(),minheap.end(),greater<int>());
                    maxheap.pop_back();
                     
                    maxheap.push_back(A[i]);
                    push_heap(maxheap.begin(),maxheap.end(),less<int>());
                }
                else
                    {
                    minheap.push_back(A[i]);
                    push_heap(minheap.begin(),minheap.end(),greater<int>());
                }
            }
            //if(maxheap.size()==minheap.size())
            //  re.push_back(minheap.front());
            //else
                re.push_back(maxheap.front());
        }
        return re;
    }
};
/*
class Middle 
{
public:
    vector<int> getMiddle(vector<int> A, int n) 
    {
        // write code here
        //插入排序
        vector<int> result;
        result.push_back(A[0]);
        for(int i=1;i<n;i++)
        {
            int k=i;
            while(k>0)
            {
                if(A[k]<A[k-1])
                    swap(A[k],A[k-1]);
                else
                    break;
                k--;
            }
            result.push_back(A[i/2]);
        }
        return result;
    }
};
*/


题目描述

现有一个字典,同时给定字典中的两个字符串s和t,给定一个变换,每次可以改变字符串中的任意一个字符,请设计一个算法,计算由s变换到t所需的最少步数,同时需要满足在变换过程中的每个串都是字典中的串。

给定一个string数组dic,同时给定数组大小n,串s和串t,请返回由s到t变换所需的最少步数。若无法变换到t则返回-1。保证字符串长度均小于等于10,且字典中字符串数量小于等于500。

测试样例:

["abc","adc","bdc","aaa”],4,”abc","bdc"
返回:2

BFS

class Change {
public:
    int countChanges(vector<string> dic, int n, string s, string t)
    {
        // write code here
        map<string,int> mapp;
        for(int i=0;i<n;i++)
        {
            mapp[dic[i]]=1;
        }
        //宽度优先搜索
        queue<string> q;
        q.push(s);
        map<string,int> mapped;
        mapped[s]=1;
        //bool flag=false;  //标示是否能变换成功
        int cur=1;   //当前层待弹出节点数目
        int next=0;
        int step=0;
        while(!q.empty())
        {
            while(cur--)
            {
                string str=q.front();
                for(int i=0;i<str.size();i++)
                {
                    string ss=str;
                    for(char c='a';c<='z';c++)
                    {
                        ss[i]=c;
                        if(ss==t)
                        {
                            return ++step;
                        }
                        if(mapped[ss]==0&&mapp[ss]==1)
                        {
                            next++;
                            mapped[ss]=1;
                            q.push(ss);
                        }
                    }
                }
                    q.pop();
           }
           cur=next;
           next=0;
            step++;
        }
        return -1;
    }
};


猜你喜欢

转载自blog.csdn.net/hellozex/article/details/81331206