Leetcode 992 as Rust and JAVA

박근수·2024년 3월 30일
0

Rust

목록 보기
3/4

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]

JAVA

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;
    }

}

Rust

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
    }
}
profile
개성이 확실한편

0개의 댓글