454. 四数相加 II
题目描述
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
解题思路
首先是一种愚蠢的做法,以为On2就是两个for循环
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn four_sum_count(nums1: Vec<i32>, nums2: Vec<i32>, nums3: Vec<i32>, nums4: Vec<i32>) -> i32 { let n = nums1.len(); use std::collections::HashMap; let mut res = 0; let mut map3: HashMap<i32, usize> = HashMap::new(); let mut map4: HashMap<i32, usize> = HashMap::new(); for i in 0..n { *map3.entry(nums3[i]).or_default() += 1; *map4.entry(nums4[i]).or_default() += 1; } for i in 0..n { for j in 0..n { let mut target = - nums1[i] - nums2[j]; for (&a, &b) in map3.iter() { let d = target - a; if map4.contains_key(&d) { res += b * map4.get(&d).unwrap(); } } } } res as i32 } } }
这里面白白浪费了i和j的和
学习感想
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn four_sum_count(nums1: Vec<i32>, nums2: Vec<i32>, nums3: Vec<i32>, nums4: Vec<i32>) -> i32 { let n = nums1.len(); use std::collections::HashMap; let mut res = 0; let mut map: HashMap<i32, usize> = HashMap::new(); for i in 0..n { for j in 0..n { let target = nums1[i] + nums2[j]; *map.entry(target).or_default() += 1; } } for i in 0..n { for j in 0..n { let target = - nums3[i] - nums4[j]; if map.contains_key(&target) { res += map.get(&target).unwrap(); } } } res as i32 } } }
地一下子还是没有想到要用hashmap做,感觉可能是双指针
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn four_sum_count(nums1: Vec<i32>, nums2: Vec<i32>, nums3: Vec<i32>, nums4: Vec<i32>) -> i32 { use std::collections::HashMap; let mut map: HashMap<i32, usize> = HashMap::new(); for a in nums1 { for &b in nums2.iter() { map.entry(a + b) .and_modify(|x| *x += 1usize) .or_insert(1usize); } } let mut res: usize = 0usize; for c in nums3 { for &d in nums4.iter() { map.entry(0i32 - c - d) .and_modify(|&mut x| res += x); } } res as i32 } } }