2017微软面试算法题回顾

惨痛的回忆= =
1.求一个数组中的逆序对数
思路:O(n2)的解法很明显,暴力破解即可。但这肯定不是面试官要的答案,很明显这样的题是找至少O(nlogn)的解法。
考虑使用归并排序,在归并排序中是将数组以mid分为左右两部分,合并到新的数组中的时候,比较a[i]和a[j]的大小,如果a[i]比a[j]大则a[i]之后到mid的所有数都比a[j]大,是逆序对。在递归调用中计算所有的a[i]比a[j]大的情况。

int ans=0;
void merge(int *a,int *storage,int low,int mid,int high)
{
    int i=low,j=low,k=mid+1;
    while(i<=mid&&k<=high)
    {
        if(a[i]<=a[k])
            storage[j++]=a[i++];
        else
        {
            ans+=mid-i+1;//在这里计算所有的逆序对数
            storage[j++]=a[k++];
        }
    }
            while(i<=mid)
            storage[j++]=a[i++];
        while(k<=high)
            storage[j++]=a[k++];
    for(int index=low;index<=high;index++)
    a[index]=storage[index];
}
void mergeSort(int a[],int storage[],int low,int high)
{
    if(low>=high)return;
        int mid=(low+high)/2;
        mergeSort(a,storage,low,mid);
        mergeSort(a,storage,mid+1,high);
        merge(a,storage,low,mid,high);
}

2.设计一个数据结构,在O(1)的时间复杂度下完成get(i),set(i,v),setall(v)的操作,比如一个数组,取第i个元素,设置第i个元素为v,把所有元素设置为v

3.给两个树的根节点,比较A树是不是B树的子树

    原文作者:dreamerleague
    原文地址: https://blog.csdn.net/dreamerleague/article/details/70726904
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞