js解leetcode(72)-中等

这篇博客探讨了如何使用JavaScript解决LeetCode中的几个问题,包括令牌放置策略,最大化给定数字组合的时间,按递增顺序显示卡牌的方法,翻转等价二叉树的递归解法,以及如何寻找二倍数对数组。通过排序和模拟操作,解题策略涉及到数组处理和二叉树操作,时间复杂度分析在O(nlogn)到O(n)之间。
摘要由CSDN通过智能技术生成

1.令牌放置

题目:

你的初始 能量 为 P,初始 分数 为 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 个令牌的值(下标从 0 开始)。

令牌可能的两种使用方法如下:

如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1 分 。
如果我们至少有 1 分 ,可以将令牌 i 置为反面朝上,获得 token[i] 点 能量 ,并失去 1 分 。
每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。

在使用任意数量的令牌后,返回我们可以得到的最大 分数 。

思路:因为得到能量和失去能量,所相关的分数都是1,所以是尽可能将大的数字换成能量,小的数字换成得分。

所以先排序,然后然后从最小的数字开始换成得分。如果能量不够,就把得分换成最大的数字。如果没得分,能量又比最小的数字小,说明不能换能量。直接退出

时间复杂度O(nlogn)  空间复杂度O(logn)

/**
 * @param {number[]} tokens
 * @param {number} P
 * @return {number}
 */
var bagOfTokensScore = function(tokens, P) {
  tokens.sort((a, b) => a - b);
  const l = tokens.length;
  let left = 0;
  let right = l - 1;
  let c = 0;
  let max = 0;
  while (right >= left) {
    if (P < tokens[left] && !c) break;
    if (P < tokens[left]) {
      P += tokens[right];
      right--;
      c--;
    } else {
      P -= tokens[left];
      left++;
      c++;
      max = Math.max(c, max);
    }
  }
  return max;
};

2.给定数字能组成的最大时间

题目:

给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。

24 小时格式为 "H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值