Берілген диапазонда элементтері тең индекстер саны  


Күрделілік дәрежесі орта
Жиі кіреді Сұр Оранж шынында опера Pinterest Шапшаң Yahoo
Array Сұрақ мәселесі

Сізге ан бүтін сан массив, q сұраулары және диапазон солға және оңға. «Берілген ауқымдағы бірдей элементтері бар индекстер саны» бүтін сандар санының жалпы санын <= i <оңға, сол сияқты Ai = А.j + 1.

мысал  

arr[] = {2, 2, 3, 3, 3, 4, 4, 4, 4}
Query = 2
Left = 2, right = 6
Left = 4, right = 8
3
3

Түсіндіру

1-сұрау үшін сол жақта = 2, оң жақта = 6

arr[2]=arr[3], arr[3]=arr[4], arr[5]=arr[6]

Саны - 3.

Сұраныс2 үшін сол жақта = 4, оң жақта = 8

arr[5]=arr[6], arr[6]=arr[7], arr[7]=arr[8]

Саны - 3.

Берілген диапазонда элементтері тең индекстер санытүйреуіш

 

Алгоритм  

  1. Жиым жасау.
  2. Массив арқылы өтіңіз.
  3. Егер массивтің ағымдағы элементі келесі элементке тең болса, онда құрылған массивтің элементі 1-ге тең екенін белгілеңіз.
  4. Егер индекс 0-ге тең болмаса, онда arrayDummy массивінің ағымдық элементінің және келесі массив элементінің жиынын [i] массивке сақтаңыз.
  5. Сұранысты шешіңіз, егер сол позиция 0-ге тең болса, ондаDummy массивін қайтарыңыз, әйтпесе arrayDummy [right-1] және arrayDummy [сол жақ-1] айырмасын қайтарыңыз.

Түсіндіру

Бізге ан бүтін сан жиым, ал диапазон сол және оң жақ ретінде. Бізден индекстер санын көрші элементтер бір-біріне тең болатындай етіп анықтауды сұрайды. Егер біз екі бірдей индексті тапсақ, онда екі түрлі индекстер болса, онда 1-ді санаңыз және т.б. Содан кейін біз максималды өлшемді массив жасаймыз. Біз берілген шартты қанағаттандыратын индексті есептейтін функция құрдық. Шарт мынада: іргелес екі элемент бір-біріне тең.

Сондай-ақ, қараңыз
Ханойдың қайталанатын мұнарасы

Біз массивтің басынан массивтің ұзындығынан азына өтеміз. Содан кейін массивтің ағымдағы элементі массивтің келесі элементіне тең екендігін тексереміз. Егер шарт дұрыс деп табылса. Содан кейін біз осы мәнді ағымдағы индексте '1-ге дейін белгілейміз. Біз бұл 1-ді белгілейтін боламыз, өйткені көрші элементтердің қай-қайсысының тең екендігін білетін боламыз. Сонда әр жұп 1-есеп ретінде қарастырылады, келесі жұп алдыңғы элементке ортақ ретінде бір элементпен 2-ге есептеледі және т.с.с. Егер n жұп тең болса, n-1 саны болады. Сонымен қатар индекс мәні 0-ге тең болмаса, бұл бірінші элемент болмаса, жүру кезінде дегенді білдіреді. ArrayDummy ағымының элементінің және алдыңғы элементтің жиынын arrayDummy ағымдық индексіне сақтаңыз.

Егер берілген диапазонның сол жақ индексі 0-ге тең болса, берілген әрбір сұраныс үшін массивті қайтарыңыз [оң жақ - 1]. Егер ол 0 болмаса, жай массив [оң - 1] мен массив массиві арасындағы айырмашылықты қайтарыңыз [сол жақта - 1].

код  

Санақ үшін C ++ коды, берілген диапазонда элементтері тең индекстер саны

#include <iostream>

using namespace std;

int arrayDummy[100];

void getNumbers(int a[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        if (a[i] == a[i + que
            arrayDummy[i] = 1;

        if (i != 0)
            arrayDummy[i] += arrayDummy[i - 1];
    }
}

int solveQuery(int l, int r)
{
    if (l == 0)
        return arrayDummy[r - 1];
    else
        return arrayDummy[r - 1] - arrayDummy[l - 1];
}

int main()
{
    int arr[] = { 2,2,3,3,3,4,4,4,4};
    int n = sizeof(arr) / sizeof(arr[0]);

    getNumbers(arr, n);

    int left, right;

    left = 2;
    right = 6;

    cout << solveQuery(left, right) << endl;
    left = 4;
    right = 8;
    cout << solveQuery(left, right) << endl;
    return 0;
}
3
3

Санауға арналған Java коды, берілген ауқымдағы бірдей элементтері бар индекстер саны

class IndexElementsEqual
{
    static int arrayDummy[] = new int[1000];

    public static void getNumbers(int arr[], int n)
    {
        for (int i = 0; i < n-1; i++)
        {
            if (arr[i] == arr[i + 1])
                arrayDummy[i] = 1;

            if (i != 0)
                arrayDummy[i] += arrayDummy[i - 1];
        }
    }
    public static int solveQuery(int left, int right)
    {
        if (left == 0)
            return arrayDummy[right - 1];
        else
            return arrayDummy[right - 1] - arrayDummy[left - 1];
    }
    public static void main(String args[])
    {
        int arr[] = {2,2,3,3,3,4,4,4,4};
        int n = arr.length;

        getNumbers(arr, n);

        int left, right;

        left = 2;
        right = 6;

        System.out.println(solveQuery(left, right));
        left = 4;
        right = 8;
        System.out.println(solveQuery(left, right));
    }
}
3
3

Күрделілікті талдау  

Уақыттың күрделілігі

 O (1) әрбір сұрау үшін және O (N) алдын-ала есептеу үшін.

Сондай-ақ, қараңыз
Жоғары немесе төменгі II санын тап

Ғарыштың күрделілігі

O (N) қайда «N» - бұл массивтегі элементтер саны. Бұл бос орын arrayDummy құру үшін қажет.