[已弃] LCP 5. 发 LeetCoin Javascript

292 阅读2分钟


问题地址:leetcode-cn.com/problems/co…


Attemp 1

思路

利用 object 的引用对象,用一个数组,存每一个 object 的对象,再根据关系,用 children 指向,需要获取数据的时候,直接拿即可,看代码可直接了解思路。

引用用起来虽然方便 但是很容易超时。

尝试了很多改进,依旧超时,而且本地测试,执行时间长达一分钟+,暂时放弃


代码


/**
 * @param {number} n
 * @param {number[][]} leadership
 * @param {number[][]} operations
 * @return {number[]}
 */
var bonus = function(n, leadership, operations) {
    let start = (new Date()).getTime();
    // console.log('start', start);
    let objs = [];
    for ( let i = 0; i < leadership.length; ++i ) {
        let p = leadership[i][0];
        let s = leadership[i][1];
        objs[p - 1] = objs[p - 1] || {};
        objs[p - 1].children = objs[p - 1].children || [];
        objs[s - 1] = objs[s - 1] || {};
        objs[p - 1].children.push(objs[s - 1]);
    }

    function deepAdd(obj, num) {
        obj = obj || {};
        obj.coin = obj.coin || 0;
        obj.coin += num;
        obj.coin %= 1000000007;
        if (obj.children) {
            for(let i = 0; i < obj.children.length; ++i) {
                obj.children[i] = obj.children[i] || {};
                deepAdd(obj.children[i], num);
            }
        }
    }

    function deepCount(obj) {
        if (!obj) {
            return 0;
        }
        let sum = obj.coin ? obj.coin % 1000000007 : 0;
        if (obj.children) {
            for(let i = 0; i < obj.children.length; ++i) {
                obj.children[i] = obj.children[i] || {};
                sum += deepCount(obj.children[i]);
            }
        }
        return sum;
    }

    let res = [];

    for(let i = 0; i < operations.length; ++i) {
        let [op1, op2, op3] = operations[i];
        if (op1 === 1) {
            objs[op2 - 1] = objs[op2 - 1] || {};
            objs[op2 - 1].coin = objs[op2 - 1].coin || 0;
            objs[op2 - 1].coin += op3;
            objs[op2 - 1].coin %= 1000000007;
        } else if (op1 === 2) {
            deepAdd(objs[op2 - 1], op3);
        } else {
            res.push(deepCount(objs[op2 - 1]));
        }
    }
    // console.log('delta', (new Date()).getTime() - start);
    return res;
};



Attemp 2

思路

合并重复的操作,省了一点时间 效率还是不行,放弃。


代码

/**
 * @param {number} n
 * @param {number[][]} leadership
 * @param {number[][]} operations
 * @return {number[]}
 */
var bonus = function(n, leadership, operations) {
    let start = (new Date()).getTime();
    console.log('start', start);
    let objs = [];
    for(let i = 1; i <= n; ++i) {
        objs.push({
            children: [],
            coin: 0
        });
    }
    for ( let i = 0; i < leadership.length; ++i ) {
        let p = leadership[i][0];
        let s = leadership[i][1];
        objs[p - 1].children.push(objs[s - 1]);
    }
    console.log('建立完关系树', (new Date()).getTime() - start);
    function deepAdd(obj, num) {
        obj.coin += num;
        for(let i = 0; i < obj.children.length; ++i) {
            deepAdd(obj.children[i], num);
        }
    }
    function deepCount(obj) {
        let sum = obj.coin;
        for(let i = 0; i < obj.children.length; ++i) {
            sum += deepCount(obj.children[i]);
        }
        return sum;
    }
    let res = [];

    let list1 = [];
    let list2 = [];
    let flag = 0;
    for(let i = 0; i < operations.length; ++i) {
        let [op1, op2, op3] = operations[i];
        if (op1 === 1 && (!flag || flag === 1)) {
            list1.push(operations[i]);
        } else if (op1 === 2 && (!flag || flag === 2)) {
            list2.push(operations[i])
        } else if(op1 === 3) {
            combineAndHandle();
            res.push(deepCount(objs[op2 - 1]) % 1000000007);
        } else {
            combineAndHandle();
        }
    }
    function combine(list) {
        list.sort((a, b) => a[1] - b[1]);
        let pointer = 0;
        while(pointer < list.length - 1) {
            if(list[pointer][1] === list[pointer + 1][1]) {
                list[pointer][2] += list[pointer + 1][2];
                list.splice(pointer + 1, 1);
            } else {
                pointer ++;
            }
        }
        return list;
    }
    function combineAndHandle() {
        let list = [];
        if (flag === 1) {
            list = combine(list1);
            list1 = [];
            for(let i = 0; i < list.length; ++i) {
                let { op1, op2, op3 } = list[i];
                objs[op2 - 1].coin += objs[op2 - 1].coin;
            }
        } else if (flag === 2) {
            list = combine(list2);
            list2 = [];
            for(let i = 0; i < list.length; ++i) {
                let { op1, op2, op3 } = list[i];
                deepAdd(objs[op2 - 1], op3);
            }
        }
        flag = 0;
    }
    console.log('delta', (new Date()).getTime() - start);
    return res;
};



Attemp 3

思路

参考别人的思路


没啥好的思路


下次刷题看下人气


这题人气太低了


放弃。。。