You are given two positive integer arrays spells and potions, of length n and m respectively, where spells[i] represents the strength of the ith spell and potions[j] represents the strength of the jth potion.
You are also given an integer success. A spell and potion pair is considered successful if the product of their strengths is at least success.
Return an integer array pairs of length n where pairs[i] is the number of potions that will form a successful pair with the ith spell.
Example 1:
Input: spells = [5,1,3], potions = [1,2,3,4,5], success = 7
Output: [4,0,3]
Explanation:
- 0th spell: 5 * [1,2,3,4,5] = [5,10,15,20,25]. 4 pairs are successful.
- 1st spell: 1 * [1,2,3,4,5] = [1,2,3,4,5]. 0 pairs are successful.
- 2nd spell: 3 * [1,2,3,4,5] = [3,6,9,12,15]. 3 pairs are successful.
Thus, [4,0,3] is returned.
Example 2:
Input: spells = [3,1,2], potions = [8,5,8], success = 16
Output: [2,0,2]
Explanation:
- 0th spell: 3 * [8,5,8] = [24,15,24]. 2 pairs are successful.
- 1st spell: 1 * [8,5,8] = [8,5,8]. 0 pairs are successful.
- 2nd spell: 2 * [8,5,8] = [16,10,16]. 2 pairs are successful.
Thus, [2,0,2] is returned.
Constraints:
- n == spells.length
- m == potions.length
- 1 <= n, m <= 105
- 1 <= spells[i], potions[i] <= 105
- 1 <= success <= 1010
抽中了跟昨天基本一样的题
spells 倒序排序, potions 正序排序, 取出一个 spell, 然后将所有与它的乘积小于 success 的 potion 都移出 potions, 此时 potions.len()就是该 spell 的答案
use std::cmp::Reverse;
use std::collections::BinaryHeap;
impl Solution {
pub fn successful_pairs(spells: Vec<i32>, potions: Vec<i32>, success: i64) -> Vec<i32> {
let mut spells: BinaryHeap<(i64, usize)> = spells.into_iter().enumerate().map(|(i, v)| (v as i64, i)).collect();
let mut potions: BinaryHeap<Reverse<i64>> = potions.into_iter().map(|v| Reverse(v as i64)).collect();
let mut ans = vec![0; spells.len()];
while let Some((ss, i)) = spells.pop() {
while let Some(Reverse(ps)) = potions.pop() {
if ss * ps >= success {
potions.push(Reverse(ps));
break;
}
}
ans[i] = potions.len() as i32;
}
ans
}
}