/* * @lc app=leetcode id=1365 lang=rust * * [1365] How Many Numbers Are Smaller Than the Current Number * * https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number/description/ * * algorithms * Easy (85.26%) * Total Accepted: 29.6K * Total Submissions: 34.7K * Testcase Example: '[8,1,2,2,3]' * * Given the array nums, for each nums[i] find out how many numbers in the * array are smaller than it. That is, for each nums[i] you have to count the * number of valid j's such that j != i and nums[j] < nums[i]. * * Return the answer in an array. * * * Example 1: * * * Input: nums = [8,1,2,2,3] * Output: [4,0,1,1,3] * Explanation: * For nums[0]=8 there exist four smaller numbers than it (1, 2, 2 and 3). * For nums[1]=1 does not exist any smaller number than it. * For nums[2]=2 there exist one smaller number than it (1). * For nums[3]=2 there exist one smaller number than it (1). * For nums[4]=3 there exist three smaller numbers than it (1, 2 and 2). * * * Example 2: * * * Input: nums = [6,5,4,8] * Output: [2,1,0,3] * * * Example 3: * * * Input: nums = [7,7,7,7] * Output: [0,0,0,0] * * * * Constraints: * * * 2 <= nums.length <= 500 * 0 <= nums[i] <= 100 * */ impl Solution { pub fn smaller_numbers_than_current(nums: Vec) -> Vec { let mut cns:Vec = nums.to_vec(); cns.sort(); let mut hm: HashMap = HashMap::new(); for (i, n) in cns.iter().enumerate(){ if !hm.contains_key(n) { hm.insert(*n, i as i32); } } // let res:Vec = nums.iter().map(|n| hm[n]).collect::>() // println!("{:?}", res); // nums } } // 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} }