注:本文仅提供解题思路,代码为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
提示:
S
是平衡括号字符串,且只含有 (
和 )
。2 <= S.length <= 50
解:
857. 雇佣 K 名工人的最低成本
有 N
名工人。 第 i
名工人的工作质量为 quality[i]
,其最低期望工资为 wage[i]
。
现在我们想雇佣 K
名工人组成一个工资组。在雇佣 一组 K 名工人时,我们必须按照下述规则向他们支付工资:
返回组成一个满足上述条件的工资组至少需要多少钱。
示例 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 <= K <= N <= 10000
,其中 N = quality.length = wage.length
1 <= quality[i] <= 10000
1 <= wage[i] <= 10000
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 <= p <= 1000
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
提示:
0 <= A.length <= 20000
0 <= B.length <= 20000
A
和 B
仅由小写字母构成。解:
分析情况:1、两者存在空串,返回false
2、只存在两处不同,其他不同数为false
3、没有不同,同时串中没有重复字符为false(交换后必然不同)
4、两处不同交叉相等,才为true