Информация об изменениях

Сообщение Re: Leetcode - 3Sum. Не пойму, чего хотят от 06.05.2022 8:24

Изменено 06.05.2022 8:37 ArtDenis

Re: Leetcode - 3Sum. Не пойму, чего хотят
Здравствуйте, Marty, Вы писали:

M>https://leetcode.com/problems/3sum/


Решил глянуть что вообще такое leetcode на этом примере

Мой вариант на расте. PS: Возможно что-то неправильно понял в задании + не проверял

use std::collections::*;
use itertools::*;

pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
    let mut lookup = HashMap::new(); // value -> index

    let mut lookup_minus_sum = |sum| -> Option<(i32, usize, i32, usize)> {
        lookup.clear();
        for (idx, value) in nums.iter().enumerate() {
            let sum_minus = sum - value;
            if let Some(i) = lookup.get(&sum_minus) {
                return Some((*value, idx, sum_minus, *i));
            } else {
                lookup.insert(*value, idx);
            }
        }
        None
    };

    nums.iter().enumerate()
        .filter_map(|(i, v)| lookup_minus_sum(-v).and_then(  // находим пару в nums, такую что их сумма равна -v:
            |(v2, j, v3, k)| 
        Some((i, *v, j, v2, k, v3))
        ))
        .filter(|(i, _, j, _, k, _)|                         // отсеиваем по индексам i != k && j!= k && k != i
            i != k && j != k && k != i
        )  
        .map(|(_, v1, _, v2, _, v3)|                         // формируем тройки
            (v1, v2, v3)
        )               
        .unique()                                            // оставляем только уникальные тройки
        .map(|(v1, v2, v3)|                                  // как требует задание, тройка должна быть вектором
            vec![v1, v2, v3]
        )                    
        .collect()                                           // получаем конечный вектор векторов
}
Re: Leetcode - 3Sum. Не пойму, чего хотят
Здравствуйте, Marty, Вы писали:

M>https://leetcode.com/problems/3sum/


Решил глянуть что вообще такое leetcode на этом примере

Мой вариант на расте. PS: Возможно что-то неправильно понял в задании + не проверял

use std::collections::*;
use itertools::*;

pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
    let mut lookup = HashMap::new(); // value -> index

    let mut lookup_minus_sum = |sum| -> Option<(i32, usize, i32, usize)> {
        lookup.clear();
        for (idx, value) in nums.iter().enumerate() {
            let sum_minus = sum - value;
            if let Some(i) = lookup.get(&sum_minus) {
                return Some((*value, idx, sum_minus, *i));
            } else {
                lookup.insert(*value, idx);
            }
        }
        None
    };

    nums.iter().enumerate()
        .filter_map(|(i, v)| lookup_minus_sum(-v).and_then(  // находим пару в nums, такую что их сумма равна -v:
            |(v2, j, v3, k)| 
                Some((i, *v, j, v2, k, v3))
        ))
        .filter(|(i, _, j, _, k, _)|                         // отсеиваем по индексам i != k && j!= k && k != i
            i != k && j != k && k != i
        )  
        .map(|(_, v1, _, v2, _, v3)|                         // формируем тройки
            (v1, v2, v3)
        )               
        .unique()                                            // оставляем только уникальные тройки
        .map(|(v1, v2, v3)|                                  // как требует задание, тройка должна быть вектором
            vec![v1, v2, v3]
        )                    
        .collect()                                           // получаем конечный вектор векторов
}


PPS: поправил форматирование, чтобы было красивее )