【leetcode 第44场双周赛】赛后总结

这一次只做对了第一题,计划是做对两道题,虽然有点遗憾,但毕竟是第一次参加双周赛

希望明天的第 225 场周赛可以做对2~3道题

有一起刷 leetcode 备战春招的可以互关一下,leetcode个人主页:https://leetcode-cn.com/u/eternidad/

第一题

easy难度,用了5分钟写出来,第一的大佬仅用时45秒

public int largestAltitude(int[] gain) {
    //存储每个点的海拔高度
    int[] heights = new int[gain.length + 1];
    heights[0] = 0;
    //max存储海拔高度的最大值
    int max = 0;
    for (int i = 0; i < gain.length; i++) {
        heights[i + 1] = heights[i] + gain[i];
        max = Math.max(max, heights[i + 1]);
    }
    return max;
}

第二题

贴一下我写的代码截图,和大佬的正确题解一对比,发现我写的看上去挺憨的。

做完这道题感觉脑子逻辑好混乱,没有思路,各种数组越界

这个是我写的一部分java代码,我就不全部放出来了👇
在这里插入图片描述下面是大佬用python写的代码👇
在这里插入图片描述
借鉴 leetcode 题解的基本思路是:先找出每种语言哪些人已经学会了,再找出为了维持朋友关系,每种语言分别需要教哪些人(如果已经学会了就不需要再教了),取各个语言需要教的人数的最小值。

public int minimumTeachings(int n, int[][] languages, int[][] friendships) {
    //两个集合,分别存储每种语言已经会的人,每种语言需要教的人
    Set[] learned = new HashSet[n + 1];
    Set[] needTeach = new HashSet[n + 1];
    int min = Integer.MAX_VALUE;
    for (int i = 0; i < n + 1; i++) {
        learned[i] = new HashSet();
        needTeach[i] = new HashSet();
    }

    //找出每种语言哪些人已经学会了
    for (int i = 0; i < languages.length; i++) {
        for (int j = 0; j < languages[i].length; j++) {
            learned[languages[i][j]].add(i + 1);
        }
    }

    //核心代码
    //遍历朋友关系
    out:
    for (int i = 0; i < friendships.length; i++) {
        for (int j = 1; j < learned.length; j++) {
            //如果两个人已经可以交流,不需要再教,跳过
            //两个人都会j语言不需要再教,回到外层循环
            if (learned[j].contains(friendships[i][0]) && learned[j].contains(friendships[i][1])) {
                continue out;
            }
        }
        //不能交流,需要学习新语言
        for (int j = 1; j < learned.length; j++) {
            if (!learned[j].contains(friendships[i][0])) {
                needTeach[j].add(friendships[i][0]);
            }
            if (!learned[j].contains(friendships[i][1])) {
                needTeach[j].add(friendships[i][1]);
            }
        }

    }
    //找出最小值
    for (int i = 1; i < needTeach.length; i++) {
        min = Math.min(min, needTeach[i].size());
    }
    return min;
}

第三题

看到题后的第一感觉是用递归
参考题解:三种语言双百:灵机一动的解法:)

public int[] decode(int[] encoded) {
    //一直异或
    int n = encoded.length;
    int[] v = new int[n + 1];

    // 全部 n 个正整数的异或值
    int all = 0;
    for (int i = 1; i <= n + 1; i++) {
        all ^= i;
    }
    // 除开第一个数的异或值
    int all_but_first = 0;
    for (int i = 1; i < n; i += 2) {
        all_but_first ^= encoded[i];
    }
    // 得到第一个数
    v[0] = all ^ all_but_first;
    for (int i = 1; i <= n; i++) {
        v[i] = v[i - 1] ^ encoded[i - 1];
    }
    return v;
}

第四题

一看是hard难度,果断放弃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值