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

Π—Π°Π΄Π°Ρ‡Π°, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ рассмотрим сСгодня - 2948. Make Lexicographically Smallest Array by Swapping Elements

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

ЛСксикографичСский порядок: Массив a мСньшС массива b, Ссли Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ i, Π³Π΄Π΅ ΠΎΠ½ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, a[i] < b[i].

πŸ’‘ ИдСя:

Π‘ΡƒΠ΄Π΅ΠΌ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ замСчания:

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

  1. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° индСксов: На ΠΏΠ΅Ρ€Π²ΠΎΠΌ шагС создаём массив sorted_indices, заполняя Π΅Π³ΠΎ значСниями [0, 1, ..., n-1]. Π—Π°Ρ‚Π΅ΠΌ сортируСм этот массив ΠΏΠΎ значСниям массива nums, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ порядок элСмСнтов.
  2. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹: ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ отсортированным индСксам, объСдиняя ΠΈΡ… Π² Π³Ρ€ΡƒΠΏΠΏΡ‹, Π³Π΄Π΅ выполняСтся условиС:
    |nums[sorted_indices[i+1]] - nums[sorted_indices[i]]| <= limit.
  3. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π³Ρ€ΡƒΠΏΠΏ: Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ массив sorted_groups ΠΊΠ°ΠΊ копию sorted_indices. ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ индСксы Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок заполнСния ΠΎΡ‚Π²Π΅Ρ‚Π°.
  4. Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π°: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Π° Π½Π°Π±ΠΎΡ€Π° индСксов ΠΈ заполняСм Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ:
    answer[sorted_groups[i]] = nums[sorted_indices[i]];

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

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

impl Solution {
    pub fn lexicographically_smallest_array(nums: Vec<i32>, limit: i32) -> Vec<i32> {
        let n = nums.len();

        // Initialize sorted_indices to track the original positions of elements.
        let mut sorted_indices: Vec<usize> = (0..n).collect();

        // Sort sorted_indices based on the values in nums.
        sorted_indices.sort_unstable_by_key(|&i| nums[i]);

        // Prepare a new array for grouping indices that can be freely swapped.
        let mut sorted_groups = sorted_indices.clone();

        // Divide the indices into groups where swaps are allowed, and sort each group.
        let mut left = 0;
        for right in 1..=n {
            if right == n || nums[sorted_indices[right]] > nums[sorted_indices[right - 1]] + limit {
                sorted_groups[left..right].sort_unstable();
                left = right;
            }
        }

        // Create the final answer array by rearranging elements based on the sorted indices.
        let mut answer = vec![0; n];
        for i in 0..n {
            answer[sorted_groups[i]] = nums[sorted_indices[i]];
        }

        answer
    }
}

Tags:Β  #rust #algorithms #sort