2015蘑菇街实习生笔试题求解

mengni123321 2015-03-29 10:06:14
编程题第一题:
已知A,B,M都在集合S中,且满足A+B=M ,求M的最大值,并分析算法的复杂度。

LZ所能想到的办法:
1 先使用快速排序算法对所有元素进行排序.复杂度O(nlog(n))
2 然后两层循环求两两元素的和, 对于所得的和采用二分查找判断该和是否在集合中。若在,则保存在临时变量中。时间复杂度为O(log2(n) * n^2),空间复杂度为O(1).

当然这个办法肯定不是最好的算法,坐等大神给出好的解决办法。
...全文
1698 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
FjTKHkljykg 2015-06-29
  • 打赏
  • 举报
回复
另外一种思路:先对集合排序,时间复杂度nlogn,再把M从最大值开始遍历,A和B分别取小于M的最小值和最大值,测试A+B是否等于M,如果小则A右移,如果大则B左移。总的时间负责度为n*n 我觉的上面这个方法有个问题,集合S中的数都大于0才能成立,如果集合中有负数存在的话,M不一定以A和B都大。
colorful-宁儿 2015-04-22
  • 打赏
  • 举报
回复
楼主求详细题目哈
ybpndims 2015-04-12
  • 打赏
  • 举报
回复
楼主不会刚面试了吧
mengni123321 2015-04-03
  • 打赏
  • 举报
回复
引用 6 楼 xtzmm1215 的回复:
没参加他们家的笔试,博主回忆下还有什么题,帖出来看看嘛
其他题就不得太记得了的,还有个大题和大数据相关的,再有就是个正则表达式求解加减乘除的题目了的
小5555 2015-03-29
  • 打赏
  • 举报
回复
没参加他们家的笔试,博主回忆下还有什么题,帖出来看看嘛
mengni123321 2015-03-29
  • 打赏
  • 举报
回复
引用 3 楼 xtzmm1215 的回复:
另外一种思路:先对集合排序,时间复杂度nlogn,再把M从最大值开始遍历,A和B分别取小于M的最小值和最大值,测试A+B是否等于M,如果小则A右移,如果大则B左移。总的时间负责度为n*n 参考代码:
int FindSum(int A[],int n){
    // 排序
    sort(A,A+n);
    int left,right,sum;
    // i = C
    for(int i = n - 1;i >= 2;--i){
        left = 0,right = i - 1;
        // 判断是否有A + B = i
        while(left < right){
            sum = A[left] + A[right];
            if(sum == A[i]){
                return A[i];
            }//if
            else if(sum > A[i]){
                --right;
            }
            else{
                ++left;
            }
        }//while
    }//for
    return -1;
}
这个解法感觉还挺不错的
mengni123321 2015-03-29
  • 打赏
  • 举报
回复
引用 1 楼 xtzmm1215 的回复:
首先对集合S排序,时间负责度nlogn, 然后排序后的集合做hash,空间复杂度n M从S中的最大值开始遍历,再内层遍历集合中的每个数x,到hash表里检测M-x是否在集合中 总的时间负责度是n*n 空间复杂度n
稍有改进,但是感觉应该不是最佳的方案。
小5555 2015-03-29
  • 打赏
  • 举报
回复
另外一种思路:先对集合排序,时间复杂度nlogn,再把M从最大值开始遍历,A和B分别取小于M的最小值和最大值,测试A+B是否等于M,如果小则A右移,如果大则B左移。总的时间负责度为n*n 参考代码:
int FindSum(int A[],int n){
    // 排序
    sort(A,A+n);
    int left,right,sum;
    // i = C
    for(int i = n - 1;i >= 2;--i){
        left = 0,right = i - 1;
        // 判断是否有A + B = i
        while(left < right){
            sum = A[left] + A[right];
            if(sum == A[i]){
                return A[i];
            }//if
            else if(sum > A[i]){
                --right;
            }
            else{
                ++left;
            }
        }//while
    }//for
    return -1;
}
小5555 2015-03-29
  • 打赏
  • 举报
回复
顺求更多蘑菇街的题目~
小5555 2015-03-29
  • 打赏
  • 举报
回复
首先对集合S排序,时间负责度nlogn, 然后排序后的集合做hash,空间复杂度n M从S中的最大值开始遍历,再内层遍历集合中的每个数x,到hash表里检测M-x是否在集合中 总的时间负责度是n*n 空间复杂度n

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧