3.25 阿里笔试 第二题分析

做题的时候卡了好久,当时都没有思路,明明实例都过了,提交还是0.
看了广大网友的帖子,发现其中一个暴力的方法,每次降序排序,扣完之后,再进行排序。这样子时间复杂度太高,只能过40%。
然后发现lc2141 是跟这道题是类似的, 具体可以自己去看题解。

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for (int i = 0; i < t; i++){
            int[] data = new int[5];
            for (int j = 0; j < 5; j++){
                data[j] = in.nextInt();
            }
            System.out.println(maxTime(data));
        }
    }
    
    public static long maxTime(int[] data) {
    	int n = 4;
        var tot = 0L;
        for (var b : data) {
            tot += b;
        }
        var l = 0L;
        var r = tot / n;
        while (l < r) {
            var x = (l + r + 1) / 2;
            var sum = 0L;
            for (var b : data) {
                sum += Math.min(b, x);
            }
            if (n * x <= sum) {
                l = x;
            } else {
                r = x - 1;
            }
        }
        return l;
    }

}


#阿里笔试##阿里巴巴##面试题目#
全部评论
看到一个很聪明的优化方法,在想不到二分的情况下很有效,就是并不每次只扣1,而是在大于100的时候扣/10的数,这样效率就非常高了
点赞 回复 分享
发布于 2022-04-12 15:30
每次降序排序,扣完之后,进行归并排序的一步,时间复杂度是o(n),而不是从头排序o(nlogn),这样如何?
点赞 回复 分享
发布于 2022-03-25 17:44
生气,我也是 100% 0% 100% 😭😭😭
点赞 回复 分享
发布于 2022-03-25 14:51

相关推荐

牛客93169152...:可以发邮件,我停了三天没收到链接,发邮件问了一下,十分钟后就有了
点赞 评论 收藏
分享
老树开花:可以开始投了,不用等到觉得完全准备好。一边投一边根据面试反馈改简历是最高效的方式。简历上项目描述建议突出你解决的具体问题,比如编辑器的性能优化、大文档渲染怎么处理的,而不只是列技术栈。中厂前端实习现在竞争确实激烈,建议同时关注一些有AI业务的团队,前端加AI应用是很有差异化的组合。Vue全家桶基础扎实的话可以往SSR或者跨端方向延伸,这些是面试加分项。加油,时间还来得及。
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务