Как найти разные числа в массиве с

Раз речь пошла о циклах, то я вам покажу, как надо писать циклы!:)

#include <iostream>

int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0 };
    const size_t N = sizeof(a) / sizeof(*a);

    size_t count = 0;
    for (size_t i = 0; i < N; i++)
    {
        size_t j = 0;
        while (j < i && a[j] != a[i]) ++j;

        count += j == i;
    }

    std::cout << count << std::endl;
}

Или более содержательная программа

#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
    const size_t N = 20;
    int a[N];

    std::srand((unsigned int)std::time(nullptr));

    for ( int &x : a ) x = std::rand() % N;

    for (int x : a) std::cout << x << ' ';
    std::cout << std::endl;

    size_t count = 0;

    for (size_t i = 0; i < N; i++)
    {
        size_t j = 0;
        while (j < i && a[j] != a[i]) ++j;

        count += j == i;
    }

    std::cout << "There are " << count << " unique elements" << std::endl;
}

Вывод программы на консоль может выглядеть, к примеру, следующим образом

10 17 12 15 5 1 17 19 0 6 13 5 4 13 6 4 18 10 5 11
There are 13 unique elements

0 / 0 / 0

Регистрация: 16.09.2017

Сообщений: 27

1

Найти количество различных чисел среди элементов массива

26.09.2017, 21:36. Показов 13109. Ответов 10


Студворк — интернет-сервис помощи студентам

Дан массив x содержащий n элементов. Найти количество различных чисел среди элементов этого массива



0



Диссидент

Эксперт C

27472 / 17160 / 3783

Регистрация: 24.12.2010

Сообщений: 38,662

26.09.2017, 21:42

2

Drizzlman, Есть ли собственные соображения, наброски, скелет программы?



1



0 / 0 / 0

Регистрация: 16.09.2017

Сообщений: 27

26.09.2017, 21:57

 [ТС]

3

Нет,у меня на сегодня мозг уде не работаеи.Завтра еще подумаю.День задался тяжелым.



0



Megageorgio

79 / 81 / 66

Регистрация: 03.04.2017

Сообщений: 216

26.09.2017, 22:22

4

Drizzlman, первое что в голову бросается — это сравнить каждый элемент массива с остальными, и получится примерно вот так:

C
1
2
3
4
5
for(int i = 0, j = 0; i < n; i++) {
    for(; j < n; j++) if (arr[i] == arr[j]) break;
    j++;
    if (j == n) count++;
}

скорее всего есть варианты лучше, завтра я предложу их если этого никто не сделает до меня (в чём сомневаюсь), а кинуть прогу полностью не могу, т.к. сижу с телефона и не могу проверить правильность решения



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,272

27.09.2017, 00:04

5

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <glib.h>
 
int cmp(gconstpointer a, gconstpointer b) {
    return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b);
}
 
int main(void) {
    int array[] = { 3, 2, 4, 3, 4, 4, 2, 1, 1 };
    
    g_print("Array: ");
    for ( int i = 0; i < G_N_ELEMENTS(array); ++i )
        g_print("%d ", array[i]);
    
    GTree * set = g_tree_new(cmp);
    for ( int i = 0; i < G_N_ELEMENTS(array); ++i )
        g_tree_replace(set, GINT_TO_POINTER(array[i]), NULL);
    
    g_print("n%d different elements.n", g_tree_nnodes(set));
    
    g_tree_destroy(set);
    
    return 0;
}

Код

andrew@andrew0716 ~/c/glib
$ gcc diff_elements.c -o diff_elements -std=c99 `pkg-config --cflags --libs glib-2.0`

andrew@andrew0716 ~/c/glib
$ ./diff_elements
Array: 3 2 4 3 4 4 2 1 1
4 different elements.



1



CoderHuligan

Нарушитель

1164 / 851 / 250

Регистрация: 30.06.2015

Сообщений: 4,429

Записей в блоге: 49

27.09.2017, 18:53

6

Цитата
Сообщение от Drizzlman
Посмотреть сообщение

Найти количество различных чисел среди элементов этого массива

Более простой вариант:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>  
#define N 7
 
int cnt(int* arr, int s) 
{   
    int i, j, c = 0; 
    int f = 1;
    for ( i = 0; i < s; ++i) 
    {
        for ( j = i + 1; j < s; ++j) 
            if(arr[i] == arr[j]) 
            { 
                f = 0; 
                goto a1; 
            }
        c++; 
        a1:
        f = 1; 
    }
    return c;
}
 
int main(void) 
{  
    int arr[N] = { 2, 2, 4, 2, 2, 3, 3};
    printf("%d n", cnt(arr, N));
    return 0; 
}



0



LFC

737 / 542 / 416

Регистрация: 17.09.2015

Сообщений: 1,601

27.09.2017, 19:38

7

CoderHuligan, выдаёт ответ 3 вместо 1

C
1
2
3
4
5
6
7
8
9
10
11
12
int cnt(int* arr, int s)
{
    int i, j, c = 0;
    for ( i = 0; i < s; i++){
        for ( j = 0; j < s; j++)
            if(arr[i] == arr[j] && i != j)
                break;
        if(j == s)
            c++;
    }
    return c;
}



1



Нарушитель

1164 / 851 / 250

Регистрация: 30.06.2015

Сообщений: 4,429

Записей в блоге: 49

27.09.2017, 19:49

8

Цитата
Сообщение от LFC
Посмотреть сообщение

CoderHuligan, выдаёт ответ 3 вместо 1

Так и должно быть по смыслу задачи.



0



737 / 542 / 416

Регистрация: 17.09.2015

Сообщений: 1,601

27.09.2017, 19:55

9

CoderHuligan, my bad,меня замкнуло на «неповторяющиеся»



1



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,272

27.09.2017, 20:20

10

Всё ещё проще!

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
#define N 10
 
int main(void) {
    int array[N] = { 3, 4, 3, 4, 6, 5, 5, 6, 3, 3 }, i, j, cnt = 1;
    
    printf("Array: ");
    for ( i = 0; i < N; ++i )
        printf("%d ", array[i]);
 
    for ( i = 1; i < N; ++i ) {
        for ( j = 0; j < i && array[i] != array[j]; ++j )
            ;
        cnt += ( j == i );
    }
    
    printf("n%d different values.n", cnt);
    
    return 0;
}



5



Popovy4

1 / 1 / 0

Регистрация: 25.04.2019

Сообщений: 1

25.04.2019, 19:16

11

много смотрел в нете тот код который хотел увидеть но в большинстве примеров сравнивается i-ый элемент и предыдущий(следующий), а я хотел чтобы i-ый элемент сравнивался с каждым возможным, вот что у меня получилось
жду критики

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count = 1;
        int tmp = 0;
        System.out.println("Введите размер массива");
        int n = in.nextInt();
        System.out.println("Введиет элементы массива");
        int array[] = new int[n];
        for (int i = 0; i < n; i++) {
            array[i] = in.nextInt();
        }
        for (int j = 1; j < n; j++) {
            for (int k = 0; k < j; k++) {
                if (array[j] != array[k]) {
                    tmp = 1;
                } else {
                    tmp = 0;
                    break;
                }
 
            }
            count += tmp;
        }
        System.out.println("Уникальных элементов массива: " + count);
        in.close();
    }
 
}

P.S. да вижу топик уже давно не активен, но я только учусь и этот момент мне не давал покоя))



1



Well, I have to find how many different numbers are in an array.

For example if array is: 1 9 4 5 8 3 1 3 5

The output should be 6, because 1,9,4,5,8,3 are unique and 1,3,5 are repeating (not unique).

So, here is my code so far….. not working properly thought.

#include <iostream>

using namespace std;

int main() {
    int r = 0, a[50], n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < j; k++) {
            if (a[k] != a[j]) r++;
        }
    }
    cout << r << endl;
    return 0;
}

David G's user avatar

David G

94.1k41 gold badges166 silver badges253 bronze badges

asked Feb 6, 2013 at 23:28

user2041143's user avatar

5

Let me join the party ;)

You could also use a hash-table:

#include <unordered_set>
#include <iostream>

int main() {

    int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };
    const size_t len = sizeof(a) / sizeof(a[0]);

    std::unordered_set<int> s(a, a + len);

    std::cout << s.size() << std::endl;
    return EXIT_SUCCESS;

}

Not that it matters here, but this will likely have the best performance for large arrays.


If the difference between smallest and greatest element is reasonably small, then you could do something even faster:

  • Create a vector<bool> that spans the range between min and max element (if you knew the array elements at compile-time, I’d suggest the std::bitset instead, but then you could just compute everything in the compile-time using template meta-programming anyway).
  • For each element of the input array, set the corresponding flag in vector<bool>.
  • Once you are done, simply count the number of trues in the vector<bool>.

answered Feb 6, 2013 at 23:49

Branko Dimitrijevic's user avatar

1

A std::set contains only unique elements already.

#include <set>

int main()
{
    int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };

    std::set<int> sa(a, a + 9);
    std::cout << sa.size() << std::endl;
}

answered Feb 6, 2013 at 23:38

dreamlax's user avatar

dreamlaxdreamlax

93.6k29 gold badges161 silver badges209 bronze badges

2

How about this?

#include <list>

int main()
{
    int a[] = {1, 9, 4, 5, 8, 3, 1, 3, 5};

    std::list<int> la(a, a+9);
    la.sort();
    la.unique();
    std::cout << la.size() << std::endl;

    return 0;
}

David G's user avatar

David G

94.1k41 gold badges166 silver badges253 bronze badges

answered Feb 6, 2013 at 23:35

billz's user avatar

billzbillz

44.4k9 gold badges83 silver badges100 bronze badges

4

Since you’ve stated that you cannot use the standard library and must use loops, let’s try this solution instead.

#include <iostream>

using namespace std; // you're a bad, bad boy!

int main() 
{
    int r = 0, a[50], n;

    cout << "How many numbers will you input? ";
    cin >> n;

    if(n <= 0)
    {
        cout << "What? Put me in Coach. I'm ready! I can do this!" << endl;
        return -1;
    }

    if(n > 50)
    {
        cout << "So many numbers! I... can't do this Coach!" << endl;
        return -1;
    }   

    cout << "OK... Enter your numbers now." << endl;

    for (int i = 0; i < n; i++)
        cin >> a[i];


    cout << "Let's see... ";

    // We could sort the list but that's a bit too much. We will choose the
    // naive approach which is O(n^2), but that's OK. We're still learning!

    for (int i = 0; i != n; i++) 
    { // Go through the list once.      
        for (int j = 0; j != i; j++)
        { // And check if this number has already appeared in the list:
            if((i != j) && (a[j] == a[i]))
            { // A duplicate number!        
                r++; 
                break;
            }
        }
    }

    cout << "I count " << n - r << " unique numbers!" << endl;

    return 0;
}

I urge you to not submit this code as your homework — at least not without understanding it. You will only do yourself a disservice, and chances are that your instructor will know that you didn’t write it anyways: I’ve been a grader before, and it’s fairly obvious when someone’s code quality magically improves.

answered Feb 7, 2013 at 0:13

Nik Bougalis's user avatar

Nik BougalisNik Bougalis

10.5k1 gold badge21 silver badges37 bronze badges

4

I think the location for increasing the value of r is incorrect

#include <iostream>
using namespace std;

int main()
{
    int r=0,a[50],n;
    cin >>n;
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
    }
    for (int j=0;j<n;j++)
    {   
        bool flag = true;  
        for(int k=;k<j;k++)
        {
            if(a[k]!=a[j])
            {
               flag = false;
               break;
            }
       }
       if (true == flag) 
       {
           r++;
       }
    }
    cout << r << endl;
    return 0;
}

However, my suggestion is using more sophisticated algorithms (this algorithm has O(N^2)).

answered Feb 6, 2013 at 23:39

iampat's user avatar

iampatiampat

1,0721 gold badge12 silver badges23 bronze badges

4

this should work, however its probably not the optimum solution.

#include <iostream>

using namespace std;

int main()
{
int a[50],n;        
int uniqueNumbers; // this will be the total numbers entered and we will -- it
cin >>n;    
uniqueNumbers = n;  
for(int i=0;i<n;i++)
{
    cin >> a[i];
}   
for (int j=0;j<n;j++)
{   
    for(int k=0;k<n;k++)
    {
        /* 
        the and clause below is what I think you were missing.
        you were probably getting false positatives when j == k because a[1] will always == a[1] ;-)
        */
        if((a[k] == a[j]) && (k!=j)) 
        { uniqueNumebers--; }
    }       
}
cout << uniqueNumbers << endl;
return 0;
}

answered Feb 6, 2013 at 23:56

cameronjchurch's user avatar

0

We can use C++ STL vector in this program .

  int main() 
  {
    int a[] = {1, 9, 4, 5, 8, 3, 1, 3, 5};
    vector<int>v(a, a+9);

    sort(v.begin(), v.end()); 
    v.erase(unique(v.begin(), v.end()), v.end()); 

    cout<<v.size()<<endl;

    return 0;
  }

answered Mar 9, 2017 at 5:43

rashedcs's user avatar

rashedcsrashedcs

3,5442 gold badges37 silver badges40 bronze badges

Please dry run your code
See in the outer for loop for each element it is counted more than one inside inner loop.let us say the loop contains 1,2,3,4.1…..elements dry run it in the second iteration and third iteration 1 is counted because 1 is 1!=2 as well as 1!=3

Now solution time!!

#include<iostream>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
ll arr[1000007]={0};
int main()
{
  ios_base::sync_with_stdio(false);//used for fast i/o
    ll n;cin>>n;
      for(ll i=1;i<=n;i++)
        cin>>arr[i];

        sort(arr,arr+n);

       ll cnt=0;
                for(ll i=1;i<=n-1;i++)
                  {
                   if(arr[i+1]-arr[i]==0)
                     cnt++;
                  }
                 cout<<n-cnt<<endl;


  cin.tie(NULL);
  return 0;
}

answered Feb 25, 2018 at 1:47

Sourabh's user avatar

Not as graceful as using set but works 1.4 times faster

int a[] = {1, 9, 4, 5, 8, 3, 1, 3, 5}

std::map<int, char> m;

for (int i = 0; i < 9; i++) {
    if ( m.count(a[i]) == 0 )
        m.insert( pair<int, char>(a[i], 0x00) );
}

Keys in map m presents list of unique values in array a

user16217248's user avatar

user16217248

2,74712 gold badges15 silver badges35 bronze badges

answered May 2 at 17:17

Alexander Zyuzin's user avatar

#include<bits/stdc++.h>
using namespace std;

int find_unique(int arr[], int size){

    int ans = 0;
    for(int i = 0; i < size; i++){
        ans = ans^arr[i];  // this is bitwise operator .its call XOR  it's return only unique value..  

    }

    return ans;
}
void print_array(int arr[], int size){
    
    for(int i = 0; i < size; i++){
        cout << arr[i] << " ";
    }
    cout << endl;
}
int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);  // use for fast input and output....

    int arr[5] = {1, 3, 5, 3, 1};

    cout <<"Orginal array: " << endl;
    print_array(arr, 5);
    int result = find_unique(arr, 5);
    cout << result << endl;

    return 0;
}

charlie-map's user avatar

answered Mar 17, 2022 at 10:30

MD. Anisul Islam's user avatar

Вобщем я сделал программу, но она немного не правильно работает, если одинаковые числа идут подряд, то она их не выводит. Подскажите в чём дело? Вот полное условие: В массиве M(k) много совпадающих элементов. Найти количество различных элементов в нем. Здесь я сделал немного иначе: массив различных элементов выводится на экран, но смысл остался прежним. Задача сделать это с использованием циклов массивов и условий.

#include <locale>
#include <iostream>
#include <conio.h>
void main()
{
	setlocale(LC_ALL, "rus");
	using namespace std;
	int n, i, r=0, c=1;
	int *a = new int[99999];
	int	*b = new int[99999];
	int t, k=0;
	cout << "Введите размер массива" << endl;
	cin >> n;
	cout << "Введите размерность" << endl;
	cin >> t;
	cout << endl;
	srand((unsigned)time(NULL));
	cout << "Цикл" << endl;
	for (i = 0; i < n; i++)   // Создаём рандомный массив
	{
		a[i] = rand() % t;
		cout << a[i] << endl;
	}
	cout << endl;
	for (i = 0; i < n; i++)
	{
		for (int h=0; h < n+1; h++) {


			if (a[i] != a[h] && i!=h) {
				k++;
				if (k==i+1) {
					cout << a[i] << endl;
					break;
				}
			}
			if (a[i] == a[h] && i != h) {

				break;
			}
			

		}
		k = 0;
	}
	_getch();
}

Дан массив и целое число k, найти количество различных элементов в каждом подмассиве размера k.

Например,

Input:

 
arr[] = { 2, 1, 2, 3, 2, 1, 4, 5 };
k = 5;

 
Output:

 
The count of distinct elements in subarray { 2, 1, 2, 3, 2 } is 3
The count of distinct elements in subarray { 1, 2, 3, 2, 1 } is 3
The count of distinct elements in subarray { 2, 3, 2, 1, 4 } is 4
The count of distinct elements in subarray { 3, 2, 1, 4, 5 } is 5

Потренируйтесь в этой проблеме

Обратите внимание, что проблема конкретно нацелена подмассивы которые являются смежными (т. е. занимают последовательные позиции) и по своей сути поддерживают порядок элементов.

 
Наивным решением является рассмотрение каждого подмассива в заданном массиве и подсчет всех отдельных элементов в нем с помощью двух вложенных циклов, как показано ниже в C, Java и Python. Временная сложность этого подхода составляет O(n.k2), куда n размер ввода и k размер подмассива.

C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#include <stdio.h>

// Функция для определения количества различных элементов в каждом подмассиве

// размером `k` в массиве

void findDistinctCount(int arr[], int n, int k)

{

    // рассматриваем каждый подмассив размера `k`

    for (int x = 0; x <= n k; x++)

    {

        // поддерживает счетчик различных элементов в текущем подмассиве

        int distinct = 0;

        // текущий подмассив формируется подмассивом `arr[x, x+k)`

        for (int i = x; i < x + k; i++)

        {

            // увеличить количество различных элементов для `arr[i]` в текущем подмассиве

            distinct++;

            // проверяем, присутствует ли `arr[i]` в подмассиве `arr[x, i-1]` или нет

            for (int j = x; j < i; j++)

            {

                // если в текущем подмассиве найден повторяющийся элемент

                if (arr[i] == arr[j])

                {

                    // снимите пометку с элемента `arr[i]` как отдельный – уменьшите количество

                    distinct;

                    break;

                }

            }

        }

        printf(«The count of distinct elements in subarray [%d, %d] «

                «is %dn», x, x + k 1, distinct);

    }

}

int main(void)

{

    int arr[] = { 2, 1, 2, 3, 2, 1, 4, 5 };

    int k = 5;

    int n = sizeof(arr) / sizeof(arr[0]);

    findDistinctCount(arr, n, k);

    return 0;

}

Скачать  Выполнить код

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

class Main

{

    // Функция для определения количества различных элементов в каждом подмассиве

    // размера `k` в массиве

    public static void findDistinctCount(int[] arr, int k)

    {

        // рассматриваем каждый подмассив размера `k`

        for (int x = 0; x <= arr.length k; x++)

        {

            // поддерживает счетчик различных элементов в текущем подмассиве

            int distinct = 0;

            // текущий подмассив формируется подмассивом `arr[x, x+k)`

            for (int i = x; i < x + k; i++)

            {

                // увеличить количество различных элементов для `arr[i]` в текущем подмассиве

                distinct++;

                // проверяем, присутствует ли `arr[i]` в подмассиве `arr[x, i-1]` или нет

                for (int j = x; j < i; j++)

                {

                    // если в текущем подмассиве найден повторяющийся элемент

                    if (arr[i] == arr[j])

                    {

                        // снимите пометку с элемента `arr[i]` как отдельный – уменьшите количество

                        distinct;

                        break;

                    }

                }

            }

            System.out.printf(«The count of distinct elements in subarray [%d, %d]»

                                + » is %dn», x, x + k 1, distinct);

        }

    }

    public static void main(String[] args)

    {

        int[] arr = { 2, 1, 2, 3, 2, 1, 4, 5 };

        int k = 5;

        findDistinctCount(arr, k);

    }

}

Скачать  Выполнить код

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

# Функция для определения количества различных элементов в каждом подсписке

# размера `k` в списке

def findDistinctCount(A, k):

    # рассматривает каждый подсписок размера `k`

    for x in range(len(A) k + 1):

        # поддерживает счетчик отдельных элементов в текущем подсписке.

        distinct = 0

        # текущий подсписок формируется из подсписка `A[x, x+k)`

        for i in range(x, x + k):

            # увеличить количество различных для `A[i]` в текущем подсписке

            distinct = distinct + 1

            # проверяет, присутствует ли `A[i]` в подсписке `A[x, i-1]` или нет

            for j in range(x, i):

                # Если в текущем подсписке найден повторяющийся элемент

                if A[i] == A[j]:

                    # снять пометку с элемента `A[i]` как отдельный – уменьшить количество

                    distinct = distinct 1

                    break

        print(«The count of distinct elements in sublist»,

            f«[{x}, {x + k — 1}] is {distinct}»)

if __name__ == ‘__main__’:

    A = [2, 1, 2, 3, 2, 1, 4, 5]

    k = 5

    findDistinctCount(A, k)

Скачать  Выполнить код

Output:

 
The count of distinct elements in subarray [0, 4] is 3
The count of distinct elements in subarray [1, 5] is 3
The count of distinct elements in subarray [2, 6] is 4
The count of distinct elements in subarray [3, 7] is 5

Мы знаем, что множество не хранит повторяющихся элементов. Мы можем воспользоваться этим фактом и вставить все элементы текущего подмассива в набор. Тогда размер набора будет равен количеству отдельных элементов. Это снижает временную сложность до O(n.k) но использует O(k) дополнительное пространство.

Алгоритм может быть реализован следующим образом на C++, Java и Python. Мы можем даже расширить решение для печати содержимого набора, как показано здесь.

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#include <iostream>

#include <vector>

#include <unordered_set>

using namespace std;

// Функция для поиска всех различных элементов, присутствующих в каждом подмассиве

// размером `k` в массиве

void findDistinctCount(vector<int> const &input, int k)

{

    // цикл по вектору

    for (int i = 0; i < input.size() (k 1); i++)

    {

        unordered_set<int> distinct(input.begin() + i, input.begin() + i + k);

        cout << «The count of distinct elements in subarray [« << i << «, «

             << (i + k 1) << «] is « << distinct.size() << endl;

    }

}

int main()

{

    vector<int> input = { 2, 1, 2, 3, 2, 1, 4, 5 };

    int k = 5;

    findDistinctCount(input, k);

    return 0;

}

Скачать  Выполнить код

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import java.util.Arrays;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

class Main

{

    // Функция для поиска всех различных элементов, присутствующих в каждом подмассиве

    // размера `k` в массиве

    public static void findDistinctCount(List<Integer> input, int k)

    {

        // цикл по списку

        for (int i = 0; i < input.size() (k 1); i++)

        {

            Set<Integer> distinct = new HashSet<>();

            distinct.addAll(input.subList(i, i + k));

            System.out.println(«The count of distinct elements in «

                + «subarray [« + i + «, « + (i + k 1) + «] is «

                + distinct.size());

        }

    }

    public static void main(String[] args)

    {

        List<Integer> input = Arrays.asList( 2, 1, 2, 3, 2, 1, 4, 5 );

        int k = 5;

        findDistinctCount(input, k);

    }

}

Скачать  Выполнить код

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# Функция для поиска всех отдельных элементов, присутствующих в каждом подсписке.

# размера `k` в списке

def findDistinctCount(A, k):

    # цикл по списку

    for i in range(len(A) (k 1)):

        distinct = set(A[i:i+k])

        print(f«The count of distinct elements in sublist [{i}, {(i + k — 1)}] is»,

            len(distinct))

if __name__ == ‘__main__’:

    input = [2, 1, 2, 3, 2, 1, 4, 5]

    k = 5

    findDistinctCount(input, k)

Скачать  Выполнить код

Output:

 
The count of distinct elements in subarray [0, 4] is 3
The count of distinct elements in subarray [1, 5] is 3
The count of distinct elements in subarray [2, 6] is 4
The count of distinct elements in subarray [3, 7] is 5

Мы можем дополнительно уменьшить временную сложность до O(n) с помощью раздвижное окно техника. Идея состоит в том, чтобы сохранить частоту элементов в текущем окне на карте и отслеживать количество отдельных элементов в текущем окне (размером k). Код можно оптимизировать для получения количества элементов в любом окне, используя количество элементов в предыдущем окне, вставляя новый элемент в предыдущее окно справа и удаляя элемент слева.

Ниже приведена программа на C++, Java и Python, которая демонстрирует это:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

#include <iostream>

#include <vector>

#include <unordered_map>

#include <unordered_set>

using namespace std;

// Функция для определения количества различных элементов в каждом подмассиве

// размером `k` в массиве

void findDistinctCount(vector<int> const &input, int k)

{

    // карта для хранения частоты элементов в текущем окне размером `k`

    unordered_map<int, int> freq;

    // поддерживает количество различных элементов в каждом подмассиве размера `k`

    int distinct = 0;

    // цикл по массиву

    for (int i = 0; i < input.size(); i++)

    {

        // игнорируем первые `k` элементов

        if (i >= k)

        {

            // удалить первый элемент из подмассива, уменьшив его

            // частота на карте

            freq[input[i k]];

            // уменьшаем количество различных, если осталось 0

            if (freq[input[i k]] == 0) {

                distinct;

            }

        }

        // добавляем текущий элемент в подмассив, увеличивая его

        // количество на карте

        freq[input[i]]++;

        // увеличиваем счетчик уникальных элементов на 1, если элемент встречается первым

        // время в текущем окне

        if (freq[input[i]] == 1) {

            distinct++;

        }

        // вывести количество различных элементов в текущем подмассиве

        if (i >= k 1)

        {

            cout << «The count of distinct elements in subarray [« <<

                (i k + 1) << «, « << i << «]» << » is « << distinct << endl;

        }

    }

}

int main()

{

    vector<int> input = { 1, 1, 2, 1, 3 };

    int k = 3;

    findDistinctCount(input, k);

    return 0;

}

Скачать  Выполнить код

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

import java.util.HashMap;

import java.util.Map;

class Main

{

    // Функция для определения количества различных элементов в каждом подмассиве

    // размера `k` в массиве

    public static void findDistinctCount(int[] A, int k)

    {

        // карта для хранения частоты элементов в текущем окне размером `k`

        Map<Integer, Integer> freq = new HashMap<>();

        // поддерживает количество различных элементов в каждом подмассиве размера `k`

        int distinct = 0;

        // цикл по массиву

        for (int i = 0; i < A.length; i++)

        {

            // игнорируем первые `k` элементов

            if (i >= k)

            {

                // удалить первый элемент из подмассива, уменьшив его

                // частота на карте

                freq.put(A[i k], freq.getOrDefault(A[i k], 0) 1);

                // уменьшаем количество различных, если осталось 0

                if (freq.get(A[i k]) == 0) {

                    distinct;

                }

            }

            // добавляем текущий элемент в подмассив, увеличивая его

            // количество на карте

            freq.put(A[i], freq.getOrDefault(A[i], 0) + 1);

            // увеличиваем счетчик уникальных элементов на 1, если элемент встречается первым

            // время в текущем окне

            if (freq.get(A[i]) == 1) {

                distinct++;

            }

            // вывести количество различных элементов в текущем подмассиве

            if (i >= k 1)

            {

                System.out.println(«The count of distinct elements in subarray [« +

                        (i k + 1) + «, « + i + «]» + » is « + distinct);

            }

        }

    }

    public static void main(String[] args)

    {

        int[] input = { 1, 1, 2, 1, 3 };

        int k = 3;

        findDistinctCount(input, k);

    }

}

Скачать  Выполнить код

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

# Функция для определения количества различных элементов в каждом подсписке

# размера `k` в списке

def findDistinctCount(A, k):

    # Словарь # для хранения частоты элементов в текущем окне размером `k`

    freq = {}

    # поддерживает количество отдельных элементов в каждом подсписке размера `k`.

    distinct = 0

    # цикл по списку

    for i in range(len(A)):

        # игнорирует первые `k` элементов

        if i >= k:

            # удалить первый элемент из подсписка, уменьшив его

            # Частота # в словаре

            freq[A[i k]] -= 1

            # уменьшает количество различных, если у нас осталось 0

            if freq.get(A[i k]) == 0:

                distinct = distinct 1

        # добавить текущий элемент в подсписок, увеличив его

        # Количество # в словаре

        freq[A[i]] = freq.get(A[i], 0) + 1

        # увеличивает количество уникальных элементов на 1, если элемент встречается в первый раз.

        # время в текущем окне

        if freq.get(A[i]) == 1:

            distinct = distinct + 1

        # вывести количество различных элементов в текущем подсписке

        if i >= k 1:

            print(«The count of distinct elements in sublist»,

                f«[{(i — k + 1)}, {i}] is {distinct}»)

if __name__ == ‘__main__’:

    input = [1, 1, 2, 1, 3]

    k = 3

    findDistinctCount(input, k)

Скачать  Выполнить код

Output:

 
The count of distinct elements in subarray [0, 2] is 2
The count of distinct elements in subarray [1, 3] is 2
The count of distinct elements in subarray [2, 4] is 3

Понравилась статья? Поделить с друзьями:
  • Дендрологический парк как найти
  • Как найти молекулярная масса сернистого газа
  • Как найти логарифмическая производная
  • Как найти куст реестра
  • Как найти дома умные часы