一诺爸爸的LeetCode之旅-第179周周赛(4/4)

个人感觉这一周的题目在难度和出题水平上都要相比上一周的逊色不少。

第一题:哥德巴赫猜想

由于原题的第一题实在是太无聊了,所以我索性给改成了用代码实现哥德巴赫猜想。关于什么是哥德巴赫猜想,可以点击上面的标题链接观看B站的视频介绍。代码实现如下:

const goldbach = (max) => {
    let primeArr = [];
    let evenArr = [];
    let failArr = [];

    const isPrime = (num) => {
        let mid = Math.floor(Math.sqrt(num));
        let flag = true;

        for (let index = 2; index <= mid; index++) {
            if (num % index === 0) {
                flag = false;
                break;
            }
        }

        return flag;
    };

    const decompose = (even) => {
        for (const prime of primeArr) {
            let remain = even - prime;

            if (remain < prime) {
                break;
            } else if (primeArr.includes(remain)) {
                return [prime, remain];
            }
        }

        return null;
    }

    for (let index = 2; index <= max; index++) {
        if (index > 2 && index % 2 === 0) {
            let factor = decompose(index);

            if (factor) {
                evenArr.push([index, ...factor]);
            } else {
                failArr.push(index);
            }
        } else if (isPrime(index)) {
            primeArr.push(index);
        }
    }

    return {
        primeArr,
        evenArr,
        failArr,
    };
}

let now = Date.now();
let res = goldbach(1e4);
console.log(`NASA: ${Date.now() - now}ms`);
console.log('NASA: primeArr.length', res.primeArr.length);
console.log('NASA: evenArr.length', res.evenArr.length);
console.log('NASA: failArr.length', res.failArr.length);

第二题:灯泡开关 III

解题思路

这一题其实你没有必要去纠结当新的灯泡点亮后位于它左边的灯泡的点亮情况,这么想的话就太麻烦了,其实你只需要抓住两个index就可以了。这两个index分别是从左往右的第一个未点亮灯泡的leftIndex(base-0)以及从右往左的第一个已点亮灯泡的rightIndex(base-1),只要leftIndex等于rightIndex就说明当前已点亮的灯泡💡都是蓝色的。代码如下所示:

var numTimesAllBlue = function (light) {
    let leftIndex = 0;
    let rightIndex = -1;
    let blueCount = 0;

    let bulbArr = Array(light.length).fill(0);

    for (const bulb of light) {
        bulbArr[bulb - 1] = 1;
        rightIndex = Math.max(rightIndex, bulb);

        if (bulbArr[leftIndex]) {
            while (bulbArr[++leftIndex]) continue;

            if (leftIndex === rightIndex) {
                blueCount++;
            }
        }
    }

    return blueCount;
};

let light = [2, 1, 3, 5, 4];
console.log(`NASA: ${numTimesAllBlue(light)}`);

第三题:通知所有员工所需的时间

解题思路

这一题虽然题目描述贼拉长,但是要做的事情却十分简单,只需要把树结构构造好,记录下每个节点抵达子节点的权值(也就是通知时长),再用递归的方式求得所有抵达叶子节点的路径的权值之和中最大的那一个值就好了。代码如下:

var numOfMinutes = function (n, headID, manager, informTime) {
    function TreeNode(index, time = 0) {
        this.index = index;
        this.time = time;
        this.sub = [];
    }

    const getTree = (parent) => {
        for (let index = 0; index < manager.length; index++) {
            let parentIndex = manager[index];

            if (parentIndex === parent.index) {
                let node = new TreeNode(index, informTime[index]);
                parent.sub.push(node);
                getTree(node);
            }
        }
    }

    const getTime = (node) => {
        return node.sub.length && (node.time + Math.max(...node.sub.map(getTime)));
    };

    const root = new TreeNode(headID, informTime[headID]);

    getTree(root);

    return getTime(root);
};

let n = 15, headID = 0, manager = [-1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6], informTime = [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0];
console.log(`NASA: ${numOfMinutes(n, headID, manager, informTime)}`);

第四题:T 秒后青蛙的位置

这一题其实也很简单,没有什么太多好说的,解题思路跟第三题非常类似,也是先构造树形结构,然后算出抵达每一个节点的权值(也就是概率值),最后拿到目标节点的概率值就好了。不过,我的代码实现里用了一点小小的技巧,这个就留给读者你去探索一番啦😄

var frogPosition = function (n, edges, t, target) {
    function TreeNode(value, level, parent = null) {
        this.value = value;
        this.level = level;
        this.parent = parent;
        this.prob = 0;
        this.sub = [];
    }

    const getTree = (edges) => {
        let map = {};
        let root;

        for (const item of edges) {
            let parent = item[0];
            let child = item[1];
            map[parent] = map[parent] || new TreeNode(parent);
            map[child] = map[child] || new TreeNode(child);
            map[parent].sub.push(map[child]);
            map[child].parent = map[parent];
        }

        for (const item of Object.values(map)) {
            do {
                root = item.parent;
            } while (root);
            root = item;
            root.prob = 1;
            root.level = 0;
            break;
        }

        return {
            root,
            map,
        };
    }

    const infoTree = (node) => {
        if (!node.sub.length) return;

        let prob = 1 / node.sub.length;

        for (const child of node.sub) {
            child.prob = prob * node.prob;
            child.level = node.level + 1;
            infoTree(child);
        }
    }

    let { root, map } = getTree(edges);
    infoTree(root);
    target = map[target];
    return target.level <= t ? target.prob : 0;
};

let n = 7, edges = [[1, 2], [1, 3], [1, 7], [2, 4], [2, 6], [3, 5]], t = 5, target = 6;
console.log(`NASA: ${frogPosition(n, edges, t, target)}`);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • LeetCode新手一枚,还请多多指教~ 第一题:有多少小于当前数字的数字 解题思路 先对数组进行排序,比最小的数...
    ChrisZ_B612阅读 414评论 0 0
  • 排序算法几种分类方式: 1,稳定排序和不稳定排序 如果a==b, 当排序之前a在b的前面,排序后,a仍然在b...
    fly_ever阅读 403评论 0 0
  • 亲子日记一百天 多云 早上大宝上学后,我一个好朋友来我们家玩,我们的话题少不了孩子。朋友:xx太调皮,坐不住…...
    傻瓜也有爱阅读 209评论 0 3
  • 穿小西装的女郎 接连一个月的时间,阿原每天出门前都会看看自己的信箱里是否会有信件。然而除了账单和广告便别无他物...
    咖喱不辣阅读 454评论 7 2
  • 最近这半个月懒了很多,年底了没事就写写总结,聚聚餐吃吃饭,偶尔去挖挖鱼塘,钓钓鱼,这里所谓的鱼,不解释,你懂的。收...
    雨文阅读 850评论 0 8