220. 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原数组中该元素的个数。求原数组。原数组中元素是从 1 到 n。
Example:
原数组 4,1, 3, 2
Count array 3, 0, 1, 0
求 nlogn 的算法。
原来以为也是按照提醒,考虑通过 merge sort 的变形
http://blog.youkuaiyun.com/jiongmumu/article/details/11481827以为和这个题目一样都是寻找逆序对的
然后怎么想怎么不对,mergesort以后我根本就不知道原来数列顺序啊!
考虑用额外数组存储,可怎么想怎么不对><
后来放弃,改变思路,想到了插入排序,这不就是需要寻找后面如果排好序有几个数字比它小,它应该插入在哪里的问题
主要google jam test我以为很复杂的题目结果是那么简单插入排序!
果然基本的排序算法是那么有用。
小集合测试了下是正确的,至于大的,没有测试用例,不保证了。
void countArray(int *arr,int n,int *count)
{
int *aux=new int[n];
aux[0]=arr[n-1];
count[n-1]=0;
for(int i=n-2;i>=0;i--)
{
int left=0,right=n-i-2;
while(left<=right)
{
int mid=(left+right)/2;
if(arr[i]<aux[mid])right=mid-1;
else left=mid+1;
}
int insertNum=arr[i];
for(int k=n-i-1;k>left;k--)
{
aux[k]=aux[k-1];
}
aux[left]=insertNum;
count[i]=left;
}
delete []aux;
}
数字问题
220. 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原数组中该元素的个数。求原数组。原数组中元素是从 1 到 n。
Example:
原数组 4,1, 3, 2
Count array 3, 0, 1, 0
求 nlogn 的算法。
CODE,考虑通过 merge sort 的变形
和某题目类似。
自己编码实现吧==