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树的子树

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值