Re: [闲聊] 每日LeetCode

楼主: AyuniD (アユニ.D)   2023-10-03 23:47:21
我的想法比较不一样,偏数学一点:
由题目可以得知出现次数在两次以下的不构成 Pair,
而两次以上的情形,我们可以用排列组合中的组合去计算。
当某数出现 N 次时,其可能组成的 Pair 数为 C(N, 2)。
你可能会问说:可是这题有顺序之分啊?怎么不是用排列呢?
没有错,确实要考虑顺序,
但其实在这题里,当你在从 N 个出现位子中取 2 位出来时,也顺便帮他们排列好了,意即:
取出 i 与 j,其中 i 与 j 分别代表出现的位子
那他们的排列要嘛是 i, j,要嘛是 j, i
而我们只需要其中一种,所以其实就是组合
Code:
class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
c = Counter(nums)
result = 0
for times in c.values():
if times >= 2:
result += math.comb(times, 2)
return result
Note:
其实可以利用 math.comb 的特性 (math.comb(k, n) = 0 for n > k) 去省略掉判断 times 是不是大于 2
然后其实可以塞成一行 XD
return sum(math.comb(times, 2) for times in collections.Counter(nums).values())
※ 引述《yam276 (史莱哲林的优等生)》之铭言:
: ※ 引述《Rushia (みけねこ的鼻屎)》之铭言:
: : 1512. Number of Good Pairs
: : 给你一个整数阵列 nums,如果 nums[i] == nums[j] 且 i < j 则 (i, j) 是一个
: : Pair,求出 nums 共有几个 Pair。
: : 思路:
: : 1.用一个 map 记录之前出现过的数字数量,因为 nums[i] 介于 0 到 100 所以用
: : int[101]。
: : 2.每一轮可以产生的 Pair 为累计先前出现过的数量,把每一轮的结果加总即可。
: 思路:
: 跟这个差不多
: 主要是每次出现新数字就会多N个组合所以逻辑是result+=count;
: count+=1;
: 以及学到快速使用HashMap:
: *nums_map.entry(num).or_insert(0) += 1;
: .entry(num) : 寻找key(num)-value是存在
: .or_insert(0) : key(num)-value存在
: 就会给你value的可变引用并进行后面操作(+=1)
: key(num)-value不存在
: 则会用初始值(0)建立一对key(num)-value
: 并给你value的可变引用
: 再用这个可变引用做后面操作(+=1)
: Code:
: use std::collections::HashMap;
: impl Solution {
: pub fn num_identical_pairs(nums: Vec<i32>) -> i32 {
: let mut nums_map = HashMap::new();
: let mut result = 0;
: for num in &nums {
: match nums_map.get(num) {
: Some(count) => {
: result += count;
: }
: None => {}
: }
: *nums_map.entry(num).or_insert(0) += 1;
: }
: result
: }
: }
作者: yam276 ('_')   2023-10-03 23:52:00
我的想法是从头往尾跑 只要碰到可以成队的 前面有几个就加几次 这样顺着跑还不用考虑排列啥的
作者: wu10200512 (廷廷)   2023-10-04 00:50:00
你是谁

Links booklink

Contact Us: admin [ a t ] ucptt.com