Се роҳи тақсимоти массив дар атрофи диапазони додашуда  


Сатҳи душворӣ осон
Аксар вақт пурсида мешавад BankBazaar BlackRock Пойтахт Яке аз Citadel Фаби Озмоишгоҳҳои Moonfrog Synopsys Тиллио Yahoo
тартиботи ҳарбӣ

Изҳороти мушкилот  

Ба шумо як асал of ҳаждаҳҳо ва як қатор lowValue and highValue. Масъалаи "тақсимоти сеҷонибаи массив дар атрофи диапазони додашуда" хоҳиш мекунад, ки массивро тавре тақсим кунанд, ки массив ба се қисм тақсим карда шавад. Қисмҳои массивҳо инҳоянд:

  1. Унсурҳои қисмати аввал аз lowValue камтар хоҳанд буд,
  2. Ҷудокунии навбатӣ ба монанди он, ки элементҳо дар доираи додашуда ҷойгиранд, дар ин бахш ва
  3. Ададҳои аз highValue бузургтар қисмати сеюми массив мебошанд.

мисол  

arr[]={2,5,87,56,12,4,9,23,76,1,45}

lowValue = 15

highValue = 30
2 5 1 12 4 9 23 76 56 45 87

Шарҳ

lowValue 15 аст, ба тавре ки рақамҳо дар тарафи чап аз lowValue камтар хоҳанд буд.

Диапазон аз 15 то 30 мебошад, 23 ин рақамест, ки дар байни ин диапазон ҷойгир аст

highValue 30 аст, ҳама рақамҳо аз highValue бузургтар дар тарафи рост ҷойгир карда мешаванд.

Се роҳи тақсимоти массив дар атрофи диапазони додашудапайвандак

Алгоритм  

1. Set the startingValue to 0 and endingValue to n-1.
2. Traverse the array.
    1. Check if the current array element is less than the value of lowValue if true then swap the arr[i] and arr[startingValue] and increase both startingValues and i by 1.
    2. Else check if the current array is greater than the highValue, swap the arr[i] and arr[endingValue] and increase the value of i and decrease the value of endingValue by 1.
    3. Else increase the value of i by 1.
3. Print the array.

Шарҳ  

Мо массиви бутун ва диапазони lowValue ва highValue додем. Мо бояд массив ё тақсимоти массивро тартиб диҳем. Чунин аст, ки ҳамаи рақамҳои имконпазири массив, ки аз lowValue камтаранд, дар тарафи чапи массив бошанд. Ва шумораи массиве, ки дар байни диапазони массив ҷойгир аст, дар массив навбатӣ хоҳад буд. Ва арзишҳои навбатӣ рақамҳое хоҳанд буд, ки аз баландтарин зиёдтар хоҳанд буд.

ҳамчунин нигаред
Маблағи ҳадди аққали зеркатраса ба k баробар аст

Мо массивро аз 0 мегузаронемth индекс ба индекси охирин. Аммо пеш аз он, мо баъзе тағирёбандаҳоро эълон кардем ва онро мутаносибан бо 0 ва индекси охирини массив оғоз мекунем. Ҳангоми иваз кардан, вақте ки арзиши камтар аз lowValue ёфт шавад, амалиёт дар ибтидоиValue иҷро карда мешавад ва ҳар вақте, ки арзиши аз highValue ёфташуда зиёдтар бошад, он гоҳ амал дар endingValue иҷро карда мешавад. Мо массивро убур карда, месанҷем, ки оё унсури массиви ҷорӣ аз додашудаи LowValue камтар аст, агар true арзиши ҷории массив ва арзиши мавқеи аввалро иваз кунад. Ин қимат мо нуқтаи оғозро пайгирӣ хоҳем кард ва арзиши дигар нишондиҳандаҳои хотимаро барои иваз кардани унсурҳо риоя хоҳад кард, своп дигар иҷро карда мешавад, агар ин унсур аз арзиши элементҳои массиви ҷорӣ зиёдтар бошад. Пас endingValue, индекс меояд, ки дар он элемент бо унсури ҷорӣ иваз карда мешавад. Агар ҳеҷ кадоме аз шартҳо қонеъ набошанд, ин рақам дар ҳудуди додашуда бошад маънои онро дигар намекунад. Пас аз ба итмом расидани гардиш, мо массиви дилхоҳ дорем. Мо танҳо бояд массивро чоп кунем.

рамз  

Коди C ++ барои ҳалли се роҳи тақсимоти массив дар атрофи диапазони додашуда

#include<iostream>
using namespace std;

void getPartition(int arr[], int n, int lowValue, int highValue)
{
    int startingValue = 0, endingValue = n-1;

    for (int i=0; i<= endingValue;)
    {
        if (arr[i] < lowValue)
            swap(arr[i++], arr[startingValue++]);

        else if (arr[i] > highValue)
            swap(arr[i], arr[endingValue--]);

        else
            i++;
    }
}

int main()
{
    int arr[] = {2,5,87,56,12,4,9,23,76,1,45};
    int n = sizeof(arr)/sizeof(arr[0]);

    getPartition(arr, n, 15, 30);

    for (int i=0; i<n; i++)
        cout << arr[i] << " ";
}
2 5 1 12 4 9 23 76 56 45 87

Рамзи Java барои ҳалли се роҳи тақсимоти массив дар атрофи диапазони додашуда

class ThreeWayPartition
{
    public static void getPartition(int[] arr, int lowValue, int highValue)
    {
        int n = arr.length;

        int startingValue = 0, endingValue = n-1;

        for(int i = 0; i <= endingValue;)
        {
            if(arr[i] < lowValue)
            {

                int temp = arr[startingValue];
                arr[startingValue] = arr[i];
                arr[i] = temp;
                startingValue++;
                i++;
            }
            else if(arr[i] > highValue)
            {

                int temp = arr[endingValue];
                arr[endingValue] = arr[i];
                arr[i] = temp;
                endingValue --;
            }
            else
                i++;
        }
    }
    public static void main (String[] args)
    {
        int arr[] = {2,5,87,56,12,4,9,23,76,1,45};

        getPartition(arr, 15, 30 );

        for (int i=0; i < arr.length; i++)
        {
            System.out.print(arr[i] + " ");

        }
    }
}
2 5 1 12 4 9 23 76 56 45 87

Таҳлили мураккабӣ  

Мураккабии вақт

Эй (н) ки дар "Н" шумораи унсурҳои массив аст. Азбаски мо аз болои элементҳои массив гузаштаем, мураккабии вақт хатӣ аст.

ҳамчунин нигаред
Solution-и массиви Leetcode -ро ба кор дароред

Мураккабии фазо

О (1) зеро ягон ҷои иловагӣ лозим нест. Худи алгоритм алгоритми дар ҷои худ буда ва массиви ибтидоии додашударо нав карда истодааст. Ҳамин тариқ, мураккабии фазоии алгоритм доимӣ аст, дар ҳоле ки барнома хаттӣ аст.