/* * @lc app=leetcode id=350 lang=rust * * [350] Intersection of Two Arrays II * * https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ * * algorithms * Easy (50.43%) * Total Accepted: 301K * Total Submissions: 596.5K * Testcase Example: '[1,2,2,1]\n[2,2]' * * Given two arrays, write a function to compute their intersection. * * Example 1: * * * Input: nums1 = [1,2,2,1], nums2 = [2,2] * Output: [2,2] * * * * Example 2: * * * Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] * Output: [4,9] * * * Note: * * * Each element in the result should appear as many times as it shows in both * arrays. * The result can be in any order. * * * Follow up: * * * What if the given array is already sorted? How would you optimize your * algorithm? * What if nums1's size is small compared to nums2's size? Which algorithm is * better? * What if elements of nums2 are stored on disk, and the memory is limited such * that you cannot load all elements into the memory at once? * * */ impl Solution { pub fn intersect(mut a: Vec, mut b: Vec) -> Vec { let mut res = vec![]; a.sort(); b.sort(); let (mut i, mut j) = (0_usize, 0_usize); while i < a.len() && j < b.len() { if a[i] == b[j] { res.push(a[i]); i += 1; j += 1; } else if a[i] < b[j] { i += 1; } else { j += 1; } } res } } // pub structSolution; use std::collections::HashMap; use std::collections::HashSet; use std::fmt::Debug; use std::hash::Hash; use std::iter::FromIterator; // use std::collections::VecDeque; // use std::collections::BTreeMap; #[allow(dead_code)] pub fn print_map(map: &HashMap) { for (k, v) in map.iter() { println!("{:?}: {:?}", k, v); } } #[allow(dead_code)] pub fn say_vec(nums: Vec) { println!("{:?}", nums); } #[allow(dead_code)] pub fn char_frequency(s: String) -> HashMap { let mut res: HashMap = HashMap::new(); for c in s.chars() { *res.entry(c).or_insert(0) += 1; } res } #[allow(dead_code)] pub fn vec_counter(arr: Vec) -> HashMap { let mut c = HashMap::new(); for n in arr { *c.entry(n).or_insert(0) += 1; } c } #[allow(dead_code)] pub fn vec_to_hashset(arr: Vec) -> HashSet { HashSet::from_iter(arr.iter().cloned()) } #[allow(dead_code)] pub fn int_to_char(n: i32) -> char { // Convert number 0 to a, 1 to b, ... assert!(n >= 0 && n <= 25); (n as u8 + 'a' as u8) as char } #[allow(dead_code)] fn sayi32(i: i32) { println!("{}", i); } #[allow(dead_code)] fn sayi32_arr(arr: &Vec) { println!("{:?}", arr); } #[allow(dead_code)] pub fn bisect_left(arr: &Vec, target: i32) -> usize { let (mut lo, mut hi) = (0, arr.len() - 1); let mut mid; while lo < hi { mid = (lo + hi) >> 1; if arr[mid as usize] >= target { hi = mid; } else { lo = mid + 1; } } lo } #[allow(dead_code)] pub fn bisect_right(arr: &Vec, target: i32) -> usize { let (mut lo, mut hi) = (0, arr.len() - 1); let mut mid; while lo < hi { mid = (lo + hi + 1) >> 1; if arr[mid as usize] > target { hi = mid - 1; } else { lo = mid; } } if arr[hi] > target { hi } else { hi + 1 } }