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
思路
参考别人的思路
没啥好的思路
下次刷题看下人气
这题人气太低了
放弃。。。