算法题求教(小马、寒武纪的笔试题)

刷题太少,不知道该用什么方法…求大佬指点


1. 寒武纪c卷第一题
大意是:两个组的幸运数为M和N,数组a[ ]里是每个同学的幸运数。要求把同学们分到两组里,满足幸运数等于组幸运数减去组内某同学幸运数的同学也在该组,判断可否实现,可以的话输出每个同学所在组的幸运数。
举例
输入 M=5, N=8, a[]={4,4,1}
输出 5 8 5

2.腾讯、小马和寒武纪的笔试中都遇到过,我把它总结成一类题吧…求教降低复杂度的办法
大意是:有个时间序列数组a[ ],定义一个量q与某段时间内的最大值、最小值、累加和等等参数有关,求这个q的最大或最小值。
举例 腾讯笔试中,定义q为输出某段时间内最小值和累加和的乘积,输出q的最大值
输入 a[]={7,2,4,5,6}
输出 60
我的思路就是按部就班for循环…每次都AC一部分,剩下的就超时了🤣



#笔试题目##腾讯##寒武纪##小马智行#
全部评论
第二题滑动窗口吧
点赞 回复 分享
发布于 2019-09-18 22:14
今天小马的第三题,要用单调栈,楼主可以去学习下。
点赞 回复 分享
发布于 2019-09-18 22:14
第二题依次遍历每个数,每个数往左找到比他小的那个数为止,往右找到比他小的那个数为止,这个区间就是以当前值作为最小值的时候的结果,遍历一遍取最大。没试过,感觉可以
点赞 回复 分享
发布于 2019-09-18 23:58
点赞 回复 分享
发布于 2019-09-19 00:09
第一题有点想法,不知对错,遍历a,每个数如果能放第一组也能放第二组,就先跳过,如果只能放第一组或第二组,就放该组并从a中删除该数,并且把他放进该组所需要的那个数也从a里面删除(如果这个数有多个就删除第一个就行),如果有一个数也不能放第一组也不能放第二组,那就返回-1,这样最后如果有一个组是空的,那就从a里剩下的元素里取一个放到那个空组里就算完成分组了。
点赞 回复 分享
发布于 2019-09-19 00:20
今天小马的第三题:dp 以及 deque 都可以做;我贴一下今天dp的垃圾code吧 if __name__ == '__main__':     s1 = input().split(' ')     N, K = int(s1[0]), int(s1[1])     s2 = input().split(' ')     As = [int(s) for s in s2]     dp_sum = [0] * N     dp_max = [0] * N     dp_min = [0] * N     dp_sum[K-1] = sum(As[:K])     dp_min[K-1] = min(As[:K])     dp_max[K-1] = max(As[:K])     ans = (dp_sum[K-1] - dp_min[K-1] - dp_max[K-1]) / (K-2)     for i in range(K, N):         dp_sum[i] = dp_sum[i-1] - As[i-K] + As[i]         if As[i] >= dp_max[i-1]:             dp_max[i] = As[i]         else:             if As[i] >= As[i-K]:                 dp_max[i] = dp_max[i-1]             else:                 if As[i-K] < dp_max[i-1]:                     dp_max[i] = dp_max[i-1]                 else:                     dp_max[i] = max(As[i-K+1: i+1])         if As[i] <= dp_min[i-1]:             dp_min[i] = As[i]         else:             if As[i] <= As[i-K]:                 dp_min[i] = dp_min[i-1]             else:                 if As[i-K] > dp_min[i-1]:                     dp_min[i] = dp_min[i-1]                 else:                     dp_min[i] = min(As[i-K+1: i+1])         v = (dp_sum[i] - dp_min[i] - dp_max[i]) / (K-2)         ans = max(ans, v)     print(ans)
点赞 回复 分享
发布于 2019-09-19 00:47
腾讯遮体是否可以这样,因为不能排序,所以数据其实没有规律,直接dp感觉是没法做到的,只能采用for循环,但是可以优化,程序还有优化空间,但是不想优化了 import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class findSubsegmentMax { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String str = sc.nextLine(); String[] str_1 = str.split(" "); List<Integer> list = new ArrayList<Integer>(); for(int i=0; i<str_1.length; i++) { list.add(Integer.parseInt(str_1[i])); } int n = list.size(), maxNum=0; System.out.println("n: " + n); int[] res; for(int i=0; i<list.size(); i++) { while(i < n) { res = find(list, i, n); if(maxNum < res[0]) maxNum = res[0]; n = res[1] - 1; } n = list.size(); } System.out.println(maxNum); } public static int[] find(List<Integer> list, int m, int n) { Integer min=list.get(m), sum=0, index=-1; for(int i=m; i<n; i++) { if(min > list.get(i)) { min = list.get(i); index = i; } sum += list.get(i); } sum *= min; // System.out.println("sum and index: " + sum + " " + index); int[] ret = {sum, index}; return ret; } }
点赞 回复 分享
发布于 2019-09-19 17:07
第一题,每个数顶多有两个链接,也就是说只可能是一条链,或者一个环,环的话只要是偶数个就能搞定,链的话从链头开始分配,如果剩下最后一个那就再特殊判断一下
点赞 回复 分享
发布于 2019-09-20 15:34

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
10-10 17:54
点赞 评论 收藏
分享
评论
2
13
分享
牛客网
牛客企业服务