главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ - 2661. First Completely Painted Row or Column ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π»ΠΎΠ±, ΠΈ Π·Π° счёт этого ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ (Ρ…ΠΎΡ‚ΡŒ ΠΈ Π½Π΅ получится асимптотичСски Π»ΡƒΡ‡ΡˆΠ΅).

πŸ“‹ ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ

example-painting

НСобходимо Π½Π°ΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ индСкс i Π² массивС arr, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ:

πŸ’‘ ИдСя

Π—Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

πŸ›  Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° индСксов:
    • Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ массив pos_index, Π³Π΄Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ числа x сохраняСм Π΅Π³ΠΎ индСкс Π² arr.
      Π­Ρ‚ΠΎ обСспСчиваСт доступ ΠΊ порядковому индСксу числа Π·Π° O(1).
  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° строк:
    Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²:
    • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ значСния строки Π² ΠΈΡ… индСксы ΠΈΠ· pos_index.
    • Находим ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс.
  3. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° столбцов:
    Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ столбца:
    • ΠŸΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ значСния столбца ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΈΡ… Π² индСксы ΠΈΠ· pos_index.
    • Находим ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс.
  4. Π˜Ρ‚ΠΎΠ³:
    • ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ· максимумов ΠΏΠΎ всСм строкам ΠΈ столбцам β€” это ΠΎΡ‚Π²Π΅Ρ‚.

⏱ Асимптотика

✍️ Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

impl Solution {
    pub fn first_complete_index(arr: Vec<i32>, mat: Vec<Vec<i32>>) -> i32 {
        let m = mat.len();
        let n = mat[0].len();
        let mut pos_index = vec![0; (m * n + 1) as usize];

        // Map values in arr to their indices
        for (i, &val) in arr.iter().enumerate() {
            pos_index[val as usize] = i as i32;
        }

        let mut best = i32::MAX;

        // Check rows
        for row in &mat {
            if let Some(max_index) = row.iter().map(|&val| pos_index[val as usize]).max() {
                best = best.min(max_index);
            }
        }

        // Check columns
        for col in 0..n {
            if let Some(max_index) = (0..m).map(|row| pos_index[mat[row][col] as usize]).max() {
                best = best.min(max_index);
            }
        }

        best
    }
}