8.13 美团笔试 第四题

/**
 * 给一个数组,nums, 要求找到所有满足下列条件的三元组的“个数”
 * 1) i < j < k 
 * 2) nums[i] - nums[j] = 2nums[j] - nums[k]
 * 思路:
 * 条件2转化为nums[i] + nums[k] = 3nums[j]
 * 遍历i=0..n - 2, k = i + 2..n
 * 期间维护一个map,记录nums区间(i,j) 每一个值的个数,然后将值为 (nums[i] + nums[k]) / 3(要能够整除)的个数记录
 * 最后的数目就是结果
 */
public class Main_4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        final int n = sc.nextInt();
        int[] values = new int[n];
        for (int i = 0;i < n;++i) {
            values[i] = sc.nextInt();
        }
        long result = 0;
        for (int i = 0;i < n - 2;++i) {
            // map记录   值--个数
            Map<Integer,Integer> map = new HashMap<>();
            map.put(values[i + 1], 1);
            for (int k = i + 2;k < n;++k) {
                int target = (values[i] + values[k]);
                if (target % 3 == 0) {
                    result += map.getOrDefault(target / 3, 0);
                }
                // 到这里,values[k]可以被添加到map中了
                map.put(values[k], map.getOrDefault(values[k], 0) + 1);
            }
        }
        System.out.println(result);
    }
}

#美团笔试#
全部评论
请问ac了吗
点赞 回复 分享
发布于 2022-08-13 18:29
兄弟妙啊,我没想到可以用余数,直接暴力的
点赞 回复 分享
发布于 2022-08-13 18:29
你这样没考虑j的位置吧
点赞 回复 分享
发布于 2022-08-13 18:50
思路完全一样,只能过91,不知道哪里有问题
点赞 回复 分享
发布于 2022-08-13 19:23
请问map为什么存的是(i,j) 范围内的数呢,明明遍历的是i和k
点赞 回复 分享
发布于 2022-08-13 21:20
我直接暴力的,82%,改了long也没啥用,然后改了半天有bug,时间不够就还原版了
点赞 回复 分享
发布于 2022-08-14 00:49

相关推荐

11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
评论
4
1
分享
牛客网
牛客企业服务