leetcode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?

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的长度。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值