LeetCode 第90场周赛

注:本文仅提供解题思路,代码为python移步点击打开链接https://github.com/calssion/Leetcode-Weekly-Contest

856. 括号的分数

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
  • (A) 得 2 * A 分,其中 A 是平衡括号字符串。

示例 1:

输入: "()"
输出: 1

示例 2:

输入: "(())"
输出: 2

示例 3:

输入: "()()"
输出: 2

示例 4:

输入: "(()(()))"
输出: 6

提示:

  1. S 是平衡括号字符串,且只含有 ( 和 ) 。
  2. 2 <= S.length <= 50

解:

使用栈即可,遇'('入栈,

遇')'计算分数并开始出栈操作,同时把计得的分数也重新入栈,方便后续计算。


857. 雇佣 K 名工人的最低成本

有 N 名工人。 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] 。

现在我们想雇佣 K 名工人组成一个工资组。在雇佣 一组 K 名工人时,我们必须按照下述规则向他们支付工资:

  1. 对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。
  2. 工资组中的每名工人至少应当得到他们的最低期望工资。

返回组成一个满足上述条件的工资组至少需要多少钱。

示例 1:

输入: quality = [10,20,5], wage = [70,50,30], K = 2
输出: 105.00000
解释: 我们向 0 号工人支付 70,向 2 号工人支付 35。

示例 2:

输入: quality = [3,1,10,10,1], wage = [4,8,2,2,7], K = 3
输出: 30.66667
解释: 我们向 0 号工人支付 4,向 2 号和 3 号分别支付 13.33333。

提示:

  1. 1 <= K <= N <= 10000,其中 N = quality.length = wage.length
  2. 1 <= quality[i] <= 10000
  3. 1 <= wage[i] <= 10000
  4. 与正确答案误差在 10^-5 之内的答案将被视为正确的。

解:

按工作质量分配,考虑每次选出K个员工,

只需要满足这K个中最大的要求,就满足了K个所有的最低工资要求。

为此需要计算每个员工的工资-工作质量比wq,并按此排序

可以建立一个小根堆,先取wq中前K个建立一个堆,

将K之后的看作待插入的元素,

将值插入到堆中同时弹出堆中的最小值。

每次都重新计算sumq。而minq取其中最小的方案。

计得的最终结果存储在minq中,minp = sumq * (wq[K-1])

其中sumq为前K个员工的工作质量总和,

需满足最大的要求,所以取wq[K-1],即前K个中最大的那个。



858. 镜面反射

有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2

正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。

返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。

示例:

输入: p = 2, q = 1
输出: 2
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。

提示:

  1. 1 <= p <= 1000
  2. 0 <= q <= p

解:

作辅助线可知:每次在y轴上移动的距离其实是一样的,都为q

y轴上的移动距离用curr记录,每次+=q,当然每次都对2*p取余,即对一个往返距离取余(即相对起点距离)

还需要一个变量i记录这次的起点会在左边还是右边,对2取余可区分,每次i+=1

若curr==0,此时为底边接收器


859. 亲密字符串

给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。

示例 1:

输入: A = "ab", B = "ba"
输出: true

示例 2:

输入: A = "ab", B = "ab"
输出: false

示例 3:

输入: A = "aa", B = "aa"
输出: true

示例 4:

输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true

示例 5:

输入: A = "", B = "aa"
输出: false

提示:

  1. 0 <= A.length <= 20000
  2. 0 <= B.length <= 20000
  3. A 和 B 仅由小写字母构成。

解:

分析情况:1、两者存在空串,返回false

    2、只存在两处不同,其他不同数为false

    3、没有不同,同时串中没有重复字符为false(交换后必然不同)

    4、两处不同交叉相等,才为true

猜你喜欢

转载自blog.csdn.net/fcsfcsfcs/article/details/80790030