搜狗一面凉经挂在了算法题上


11个排序数组,找其中最小的300个数。

手写全部代码。

我的思路是O(300)O(300),最优解了吧,用11个指针下标代表每一个数组下标,依次轮训找最小值,找到后相应的指针向前移动,再比较。。。我15min写了一半遇到了问题。。凉#搜狗##面试题目##算法工程师##校招#
全部评论
最优解是lg(11)*300。你用一个带坐标的最小堆,可以在lg(11)中得到最小值的坐标。然后更新坐标,并放新值入堆。
点赞 回复
分享
发布于 2019-09-09 16:46
用最小生成树,然后11个指针依次读取。
点赞 回复
分享
发布于 2019-09-09 16:37
阅文集团
校招火热招聘中
官网直投
你这个应该是最优解啊,遇到啥问题
点赞 回复
分享
发布于 2019-09-09 16:39
有序数组直接归并不就好了…
点赞 回复
分享
发布于 2019-09-09 16:48
def sort(lists, k=300):     n = len(lists)     ans = []     heap = [(lists[i][0], i) for i in range(n)]     idx = {i: 1 for i in range(n)}     heapq.heapify(heap)     for _ in range(k):         val, i = heapq.heappop(heap)         ans.append(val)         heapq.heappush(heap, (lists[i][idx[i]], i))         idx[i] += 1          return ans 大概是这样
点赞 回复
分享
发布于 2019-09-09 18:55
#include <iostream> #include <vector> #include <queue> #include <functional> using namespace std; int main(){ // 25个数 ,找前10个最小的数  最优解lg(5)*10 ,没有实现 // 用5个指针 去解 O(10) vector<vector<int>> num{ { 1, 4, 7, 11, 13 }, {2,5,8,12,15}, {3,6,9,13,16}, {1,5,9,14,18}, {3,5,7,9,11} }; int ans[10]; // priority_queue< pair<int,int>, vector<int>, greater<int>> dui;  //最小堆 int i0 = 0, i1 = 0, i2 = 0, i3 = 0, i4 = 0; for (int n = 0; n < 10; ++n){ pair<int, int> min(0, num[0][i0]); if (min.second > num[1][i1]){ min.first = 1; min.second = num[1][i1]; } if (min.second > num[2][i2]){ min.first = 2; min.second = num[2][i2]; } if (min.second > num[3][i3]){ min.first = 3; min.second = num[3][i3]; } if (min.second > num[4][i4]){ min.first = 4; min.second = num[4][i4]; } int t = min.first; switch (t){ case 0: ++i0; break; case 1: ++i1; break; case 2: ++i2; break; case 3: ++i3; break; default:++i4; break; } ans[n] = min.second; } return 0; }
点赞 回复
分享
发布于 2019-09-26 12:44

相关推荐

1 5 评论
分享
牛客网
牛客企业服务