惨痛的回忆= =
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树的子树