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;
    }

}


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

相关推荐

点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
1 5 评论
分享
牛客网
牛客企业服务