Rust 공부할 겸 leet code 오늘의 문제를 java와 rust로 풀어봤다.
https://leetcode.com/problems/subarrays-with-k-different-integers
배열 nums와 int k가 주어지면 nums의 부분 집합(subarray) 중 특정 조건을 만족하는 부분 집합 개수의 합을 구하라.
특정 조건은 부분 집합의 원소들은 모두 k개의 다른 원소로만 이루어져야한다.
부분 집합(sub array)는 nums의 연속 배열이다.
A subarray is a contiguous part of an array.
1,4,6이 있다면 sub array의 후보는 [1], [3], [6], [1,4],[4,6],[1,4,6] 이고 [1,6]은 연속적이지 않기 때문에 subarray가 아니다.
Example 1:
Input: nums = [1,2,1,2,3], k = 2
Output: 7
Explanation: Subarrays formed with exactly 2 different integers: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2]
class Solution {
public int subarraysWithKDistinct(int[] nums, int k) {
int a = sub(nums,k);
int b = sub(nums,k-1);
return a-b;
}
public int sub(int[] nums, int k){
HashMap<Integer, Integer> map = new HashMap();
int left = 0, right = 0, ans = 0;
while( right < nums.length){
map.put(nums[right], map.getOrDefault(nums[right],0)+1);
while(map.size() > k){
map.put(nums[left],map.get(nums[left])-1);
if(map.get(nums[left]) == 0){
map.remove(nums[left]);
}
left++;
}
ans += right - left +1;
right ++;
}
return ans;
}
}
use std::collections::HashMap;
impl Solution {
pub fn subarrays_with_k_distinct(nums: Vec<i32>, k: i32) -> i32 {
let a : i32 = Solution::sub(&nums, k);
let b : i32 = Solution::sub(&nums, k-1);
a-b
}
fn sub(nums: &Vec<i32>, k:i32) -> i32 {
let mut map = HashMap::new();
let mut ans : usize = 0;
let mut right: usize = 0;
let mut left: usize = 0;
while right < nums.len(){
*map.entry(&nums[right]).or_insert(0) += 1;
while map.len() > k as usize{
*map.get_mut(&nums[left]).unwrap()-=1;
if map.get(&nums[left]).unwrap() == &0{
map.remove(&nums[left]);
}
left+=1;
}
ans += right - left + 1;
right += 1;
}
ans as i32
}
}