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

Бсылка Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ β€” 2401. Longest Nice Subarray.

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

Π”Π°Π½ массив nums, состоящий ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… чисСл.
НуТно Π½Π°ΠΉΡ‚ΠΈ наибольший подмассив, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΏΠ°Ρ€Π° чисСл Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΡ… установлСнных Π±ΠΈΡ‚ΠΎΠ²
(Ρ‚.Π΅. ΠΈΡ… ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И (&) Ρ€Π°Π²Π½ΠΎ 0).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

πŸ’‘ ИдСя

Π‘ΡƒΠ΄Π΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π² чистом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°.

βš™οΈ Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ вмСсто Ρ†ΠΈΠΊΠ»ΠΎΠ², пСрСдавая:
    • left ΠΈ right – ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ слайсы для Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ† ΠΎΠΊΠ½Π°.
    • cur_bitset – Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ мноТСство.
    • cur_len – Π΄Π»ΠΈΠ½Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°.
    • max_len – ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ подмассива.
  2. Π‘Π°Π·Π° рСкурсии – Ссли right достиг ΠΊΠΎΠ½Ρ†Π° (оказался пустым), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ max_len.
  3. Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ, Ссли right[0] Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².
  4. Π‘ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ, Ссли ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, удаляя left[0] ΠΈΠ· Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ мноТСства.

πŸ“Š Асимптотика

πŸ’» Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

impl Solution {
    pub fn longest_nice_subarray(nums: Vec<i32>) -> i32 {
        // Recursive helper function to maintain the sliding window
        fn slide_window_iter(left: &[i32], right: &[i32], cur_bitset: i32, cur_len: i32, max_len: i32) -> i32 {
            match right.first() {
                // Base case: when the right pointer reaches the end 
                None => max_len, 
                // Expand window if `right_val` has no bitwise conflicts
                Some(right_val) if cur_bitset & right_val == 0 
                  => slide_window_iter(left, &right[1..], cur_bitset | right_val, cur_len + 1, max_len.max(cur_len + 1)),
                // Shrink window from the left when there is a conflict
                _ => slide_window_iter(&left[1..], right, cur_bitset ^ left[0], cur_len - 1, max_len)
            }
        }

        // Start recursion with the full input array
        slide_window_iter(&nums, &nums, 0, 0, 0)
    }
}

Tags: #rust #algorithms #slidewindow

β–² 1 β–Ό leetcoder 18-03-2025

ΠŸΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, стоит Ρ‚Π°ΠΊΠΆΠ΅ привСсти для сравнСния

impl Solution {
    pub fn longest_nice_subarray(nums: Vec<i32>) -> i32 {
        let mut current_bitset = 0;
        let mut max_len = 0;
        let mut left = 0;

        for (right, &val) in nums.iter().enumerate() {
            // Shrink the window if nums[right] conflicts with current_bitset
            while current_bitset & val != 0 {
                current_bitset ^= nums[left];
                left += 1;
            }

            // Expand the window by including nums[right]
            current_bitset |= val;
            max_len = max_len.max((right - left + 1) as i32);
        }

        max_len
    }
}
ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ