腾讯面试题,给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数

一道腾讯面试题要求根据上排的10个数字,在下排填写对应的出现次数。通过观察,发现可以用递归和分治法解决,时间复杂度为O(n^2),可以通过哈希表优化到O(n)。
摘要由CSDN通过智能技术生成

题目:

给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数

要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 【 0,1,2,3,4,5,6,7,8,9 】
分配: 【 6,2,1,0,0,0,1,0,0,0 】
0在下排出现了6次,
1在下排出现了2次,
2在下排出现了1次,
3在下排出现了0次....
我一开始看到这道题的时候,真是手足无措.实在是没有什么特别好的办法,只能用蛮力法想解决这道题.时间效率比较低.
蛮力法的切入点是什么,这需要好好想一想.
以上面的例子为例:
0在下排出现了6次,即下排有6个0,有2个1,有1个2,有1个6.
仔细观察,可以发现一个共同点:
对于一个数组A[n],下排的数字总和为n.
可以由之前的字符的全排列中找到灵感.
因此可以定义一个函数ArrayF(int* A,int n,int Sum),这个函数的功能是:使得A[0]+A[1]+A[2]+….+A[n-1]=Sum.其中A[i]=m,i=0,1,2,3….n-1,0<m<n-1.
这样子就可以用分治法来解决这个问题了.
假设A[n-1]取值i,则i的可能性是:0,1,2,3,4……n-1.则余下来的n-1个元素的数组就可以调用ArrayF(A,n-1,Sum-i)来解决.
递推式:
F(A[n],Sum)=:(A[0]=Sum) n==1
F(A[n],Sum)=:(A[n-1]=i)+F(A[n-1],Sum-i) n>1

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值