leetcode 每日一题1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
我的思路
对于 queries 中每个的 querie,都可以计算出最少吃的个数(等于天数)以及最多能吃到的个数(等于天数 × 每日最多能吃到的个数)。
根据示例 2,可以思考出:如果我们计算出 candies 的前缀和,每个对应 querie[0]位置的前缀和正好在最大与最小之间,那么一定能吃到!
然后就出现了第一个问题!示例中的第一个示例,由于[0,2,2]这个 querie 的 maxeat 为 4,mineat 为 2,7 显然大于 4,不在区间[2,4]中,该 querie 被判定为 false,而实际情况其实是可以吃到的。这样的话刚刚拟定的判定条件是有问题的!经过一系列测试更改,都没有的到完美的结果。
于是,查看了题解
看完后发现自己错过了很重要的一个问题!我们是从第 0 天开始吃糖果,那这样的话判定条件应该改为 mineat = day+1,maxeat = (day+1) * dailyCap;
var canEat = function (candiesCount, queries) {
var prefix = [],
answer = [];
prefix[0] = candiesCount[0];
for (let j = 1; j < candiesCount.length; j++) {
prefix[j] = prefix[j - 1] + candiesCount[j];
}
// console.log(prefix);
for (var i = 0; i < queries.length; i++) {
answer[i] = canUEat(queries[i], prefix);
}
return answer;
};
var canUEat = function (querie, prefix) {
// important
var mineat = querie[1] + 1;
var maxeat = (querie[1] + 1) * querie[2];
if (querie[0] == 0 && prefix[querie[0]] >= maxeat) {
return true;
} else if (prefix[querie[0]] >= mineat && prefix[querie[0]] <= maxeat) {
return true;
} else {
return false;
}
};
啊,改过了还是错了,再去看题解。!!!
又看了一次题解
题解的意思是,最想吃的糖果是有一个区间的,能吃到的糖果有另一个区间,如果两个区间有交集,证明answer为true,否则为false。我只想到了能吃到的糖果有一个区间,然后看最后一个想吃的糖果在不在这个区间里,没有考虑到只要吃到想吃的就是胜利!可能想吃的糖果第一个在区间里,但是最后一个不在区间里。
/**
* @param {number[]} candiesCount
* @param {number[][]} queries
* @return {boolean[]}
*/
var canEat = function (candiesCount, queries) {
var prefix = [],
answer = [];
prefix[0] = candiesCount[0];
for (let j = 1; j < candiesCount.length; j++) {
prefix[j] = prefix[j - 1] + candiesCount[j];
}
// console.log(prefix[92]);
for (var i = 0; i < queries.length; i++) {
// answer[i] = canUEat(queries[i],prefix);
var mineat = queries[i][1] + 1;
var maxeat = (queries[i][1] + 1) * queries[i][2];
// if(prefix[queries[i][0]] >= mineat && prefix[queries[i][0]] <= maxeat){answer[i] = true;}
// else if(queries[i][0] == 0 && prefix[queries[i][0]]>=maxeat){answer[i] = true;}
// else{answer[i] = false;}
var prefixMin = queries[i][0] == 0 ? 1 : prefix[queries[i][0] - 1] + 1;
var prefixMax = prefix[queries[i][0]];
if (mineat > prefixMax || maxeat < prefixMin) {
answer[i] = false;
} else {
answer[i] = true;
}
}
return answer;
};
另外,发现一个题解很不错
这个题解虽说是python语言,但是图画的很好,十分清晰明了!值得学习!
最后,复杂度分析:
时间复杂度:
O
(
n
+
q
)
O(n+q)
O(n+q),
O
(
n
)
O(n)
O(n)是计算前缀和的时间复杂度,
O
(
q
)
O(q)
O(q)是计算每个answer的时间复杂度。
空间复杂度:
O
(
n
)
O(n)
O(n),存了一下前缀和数组,n为candiesCount的长度。