Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
0 / 0 / 0
Регистрация: 06.06.2023
Сообщений: 9

Самый длинный подмассив массива состоящий из одинаковых чисел, с удалением до k элементов

31.08.2023, 20:17. Показов 5312. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с задачей

Дан массив длины n и число k. Необходимо максимизировать количество одинаковых чисел, идущих подряд, удаляя из массива до k (включительно) элементов.

Формат входных данных
В первой строке входа заданы два целых числа n и k (1 ≤ n ≤ 1 000 000, 1 ≤ k ≤ 1 000 000) — длина массива и количествоо чисел которые можно удалить. В следующей строке заданы n целых чисел c_i (1 ≤ c_i ≤ n) — элементы массива

Формат результата
Выведите одно число — максимальную длину последовательности, которую можно получить, удаляя числа

Примеры
Входные данные
8 2
2 4 4 2 1 4 2 4
Результат работы
3
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2023, 20:17
Ответы с готовыми решениями:

В массиве чисел найдите самый длинный подмассив из одинаковых чисел
Помогите делать задание, пожалуйста: в массиве чисел найдите самый длинный подмассив из одинаковых чисел.

В заданном линейном массиве найти самый длинный фрагмент, состоящий из одинаковых элементов
МАССИВ в заданном линейном массиве размерностью N найти самый длинный фрагмент, состоящий из одинаковых элементов.

Найти самый длинный подмассив, который является арифметической прогрессией
В заданном массиве целых чисел X=(x1,x2,...xn)найти самый длинный подмассив, который является арифметической прогрессией. Помогите...

42
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,138
Записей в блоге: 2
15.02.2026, 00:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от igorrr37 Посмотреть сообщение
Но левый край мы двигаем к ближайшей дырке - к индексу 1, и теперь число 0 становится новым головным элементом, и kt нужно пересчитать для него
Индекс 1 не имеет никакого смысла как голова - "затраты" те же что и для индекса 0, а диапазон меньше. Смысл сдвига левой границы - получить большее kt чтобы можно было опять расширяться вправо

Не по теме:

Интересная деталь/вещь. Вы заметили что наш разговор быстро стал "перепалкой", типа "так правильно", "нет, не так" :) Конечно в этом нет ничего плохого, отстаивать свое мнение - это нормально. Но с точки зрения поиска багов/тестирования - это ужасно. Обширная полемика для ... примера 27 строк. Значит в 127 - просто утонем, что ли? Что не так, почему так происходит?

0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
15.02.2026, 08:02
Рассматривать за один проход по массиву только одно число - тоже вариант если не пугает квадратичная сложность. Но и тут можно оптимизировать: если у нас kt равен -1 а мы перешагнули через одну дырку то kt просто вырастает до нуля и правую границу можно продолжать двигать вправо, не обязательно сбрасывать kt до 2 начинать двигать правую границу от левой

Добавлено через 1 час 16 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Что не так, почему так происходит?
Потому что мы обсуждаем две разные программы: с линейной и с квадратичной сложностью
Цитата Сообщение от Igor3D Посмотреть сообщение
утонем, что ли?
Если тема интересная то почему бы и не утонуть
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,325
15.02.2026, 10:21
Господа. Я написал эту прогу, но не уверен в правильности её работы. Не мог бы кто-нибудь протестировать её на своем алгоритме. Длина последовательности = 1 000 000 (по максимуму). В последовательности числа в диапазоне 1 - 50. Последовательность создается генератором случайных чисел (код ниже). Удалять можно 20 чисел.

Мой результат: 7 чисел (31).

C++ (Qt)
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
int my_rnd(int x)
{
    static quint64 baza = 12;
 
    baza = (baza * 154985 + 129) % 3514163;
    return baza % x;
}
 
 
 
// кнопка 1
void Widget::press_pbtn_01()
{
 
    QList<int> lst;
 
    //lst << 2 << 4 << 4 << 2 << 1 << 4 << 2 << 4;
 
    for(int i = 0; i < 1000000; i++)
    {
        lst << 1 + my_rnd(50);
    }
 
 
    int n = 20;
 
    int k, n1, x1, x2;
    int k_max = 0;
    int rez;
 
    int cx = 0;
 
    for(int i = 0; i < lst.size(); i++)
    {
        x1 = lst.at(i);
        k = 1;
        n1 = n + 1;
 
        if(i > (lst.size() - k_max)) continue;
 
        for(int j = i+1; j < lst.size(); j++)
        {
            cx++;
            x2 = lst.at(j);
 
            if(x1 == x2) k++;
            else n1--;
 
            if(k_max < k) {k_max = k; rez = x1;}
            if(!n1) break;
        }
    }
 
    ui->label_01->setText(QString::number(k_max) + "   " + QString::number(rez));
    ui->label_02->setText(QString::number(cx));
}
0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
15.02.2026, 12:11
alexu_007, у меня вот так получилось. Я так понимаю подобную программу и имел ввиду Igor3D
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
int quadratic(std::vector<int> const& vct, int const k)
{
    int kt = k, ns{}, max{}, maxt{};
    for (int i = 0; i < vct.size(); )
    {
        maxt = 0;
        ns = vct[i];
        kt = k;
 
        for (int j = i; j < vct.size() && kt > -1; ++j)
        {
            if (ns == vct[j])
                ++maxt;
            else
                --kt;
        }
        max = std::max(max, maxt);
        while (i < vct.size() && vct[i] == ns)
        {
            ++i;
        }
    }
    return max;
}
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
15.02.2026, 15:34
Вариант от чат жпт ("чистый стандартный C++, строго O(n), работает в MSVC / MinGW / Clang"):
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
#include <iostream>
 
using namespace std;
 
static const int MAXN = 1000000 + 5;
 
int last_pos[MAXN];
int head_pos[MAXN];
int cnt[MAXN];
int prev_same[MAXN];
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n, k;
    cin >> n >> k;
 
    for (int i = 1; i <= n; ++i) {
        last_pos[i] = -1;
        head_pos[i] = -1;
        cnt[i] = 0;
    }
 
    int ans = 0;
 
    for (int i = 0; i < n; ++i) {
        int x;
        cin >> x;
 
        prev_same[i] = last_pos[x];
        last_pos[x] = i;
 
        if (head_pos[x] == -1)
            head_pos[x] = i;
 
        int c = ++cnt[x];
 
        while (i - head_pos[x] - (c - 1) > k) {
            head_pos[x] = prev_same[head_pos[x]];
            c = --cnt[x];
        }
 
        if (c > ans)
            ans = c;
    }
 
    cout << ans << '\n';
    return 0;
}
Для n = 10^6 "заявлено":
Время ≈ 0.2–0.35 сек
Память ≈ 16–18 MB
2
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
15.02.2026, 16:19
gunslinger, неправильные ответы выдаёт
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
15.02.2026, 16:49
неплохо было бы сперва создать файл с входными и выходными данными для проверки корректности работы программы. Одного примера из первого поста недостаточно. Ну и потом каждый, кто предлагает свой вариант решения, мог просто тестировать на этом файле.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
15.02.2026, 16:53
igorrr37, ну значит код кривой (хоть и выглядит "пристойно"). У меня нет тестов, чтобы проверить.
0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
15.02.2026, 17:02
Лучший ответ Сообщение было отмечено Igor3D как решение

Решение

У меня для тестов вот такая прога. Здесь две ф-ции. Одна работает за квадратичное время, вторая за линейное. Их результаты совпадают, что означает что они дают верные ответы. Если кто хочет то может встраивать сюда свою ф-цию в качестве третьей и сверять ответы.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
#include <algorithm>
#include <cassert>
#include <ranges>
namespace rng = std::ranges;
 
// линейная сложность
int linear(std::vector<int> const& vct, int const k)
{
    std::vector<int> vn(vct.size() + 1);
    int kt = k, ns{}, max{}, maxt{}, i{}, j{};
    for (i = 0; i < vct.size(); )
    {
        ns = vct[i];
        kt = k - (j - i - vn[vct[i]]);
        maxt = vn[vct[i]];
        for (; j < vct.size() && kt >= 0; ++j)
        {
            vn[vct[j]]++;
            if (vct[j] != ns)
                --kt;
            else
                ++maxt;
        }
        max = std::max(max, maxt);
        while (i < vct.size() && vct[i] == ns)
        {
            ++i;
            --vn[ns];
        }
    }
    return max;
}
 
// квадратичная сложность
int quadratic(std::vector<int> const& vct, int const k)
{
    int kt = k, ns{}, max{}, maxt{};
    for (int i = 0; i < vct.size(); )
    {
        maxt = 0;
        ns = vct[i];
        kt = k;
 
        for (int j = i; j < vct.size() && kt > -1; ++j)
        {
            if (ns == vct[j])
                ++maxt;
            else
                --kt;
        }
        max = std::max(max, maxt);
        while (i < vct.size() && vct[i] == ns)
        {
            ++i;
        }
    }
    return max;
}
 
int main()
{
    int const cnt = (int)1e4; // размер массива
    std::vector<int> vct(cnt); // массив
    std::mt19937 eng{ (unsigned)time(nullptr) };
    int uidMin = 1, uidMax = 100;
    if (uidMax >= cnt)
        throw;
    std::uniform_int_distribution<int> uid{ uidMin, uidMax };
    while (true)
    {
        for (auto& val : vct)
            val = uid(eng); // рандомно заполняем массив
        int k = uid(eng); // число k
 
        int maxLin = linear(vct, k);
        int maxQuad = quadratic(vct, k);
 
        std::cout << "k = " << k << "  " << maxLin << " == " << maxQuad << "\n";
        if (maxLin != maxQuad)
            throw 1;
    }
}
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
15.02.2026, 17:05
Цитата Сообщение от igorrr37 Посмотреть сообщение
Их результаты совпадают, что означает что они дают верные ответы.
а если они обе дают неверные ответы?
0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
15.02.2026, 17:15
Royal_X, они не могут давать совпадающие неверные ответы во всех тестах если работают по разным алгоритмам. Хотя теоретически всё возможно
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
15.02.2026, 17:19
Вот код от GPT-4o mini:
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 <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
 
using namespace std;
 
int maxLengthWithKRemovals(int n, int k, const vector<int>& c) {
    unordered_map<int, int> freq; // Словарь для подсчёта частоты элементов
    int left = 0;
    int max_count = 0; // Максимальное количество одинаковых элементов в текущем окне
    int max_length = 0; // Максимальная длина последовательности
 
    for (int right = 0; right < n; ++right) {
        freq[c[right]]++;
        max_count = max(max_count, freq[c[right]]);
 
        // Условия сужения окна, если количество удалённых элементов больше k
        while ((right - left + 1) - max_count > k) {
            freq[c[left]]--;
            if (freq[c[left]] == 0) {
                freq.erase(c[left]); // Удаляем элемент из словаря, если его больше нет
            }
            left++;
        }
 
        // Обновляем максимальную длину
        max_length = max(max_length, right - left + 1);
    }
 
    return max_length;
}
 
int main() {
    int n, k;
    cin >> n >> k;
    vector<int> c(n);
    for (int i = 0; i < n; ++i) {
        cin >> c[i];
    }
 
    int result = maxLengthWithKRemovals(n, k, c);
    cout << result << endl;
 
    return 0;
}
Проверьте, если хотите.
Объяснение кода:

1. **Считывание данных**: Используются стандартные потоки ввода для считывания длины массива n, количества удаляемых элементов k и самого массива c.

2. **Структура `unordered_map`**: Для хранения наибольшего количества одинаковых элементов в текущем окне.

3. **Два указателя**: `left` и `right` управляют окном.

4. **Проверка условий**: Если количество элементов в текущем окне минус максимальное количество повторений превышает k, окно сужается.

5. **Вывод результата**: После выполнения всех итераций выводится максимальная длина последовательности.

Этот код должен быть эффективным и работать в пределах заданных ограничений n и k.
0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
15.02.2026, 17:27
gunslinger, неправильно
vct = { 2, 4, 4, 2, 1, 4, 2, 4 };
k = 2;
даёт ответ 5
1
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,138
Записей в блоге: 2
15.02.2026, 21:08
Цитата Сообщение от igorrr37 Посмотреть сообщение
Если кто хочет то может встраивать сюда свою ф-цию в качестве третьей и сверять ответы.
Встроил, результаты совпадают
Кликните здесь для просмотра всего текста
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
#include <algorithm>
#include <cassert>
#include <unordered_map>
 
struct SWin {
    int beg, end, count = 0;
};
 
// линейная сложность
int linear(std::vector<int> const& vct, int const k)
{
    std::vector<int> vn(vct.size() + 1);
    int kt = k, ns{}, max{}, maxt{}, i{}, j{};
    for (i = 0; i < vct.size(); )
    {
        ns = vct[i];
        kt = k - (j - i - vn[vct[i]]);
        maxt = vn[vct[i]];
        for (; j < vct.size() && kt >= 0; ++j)
        {
            vn[vct[j]]++;
            if (vct[j] != ns)
                --kt;
            else
                ++maxt;
        }
        max = std::max(max, maxt);
        while (i < vct.size() && vct[i] == ns)
        {
            ++i;
            --vn[ns];
        }
    }
    return max;
}
 
// квадратичная сложность
int quadratic(std::vector<int> const& vct, int const k)
{
    int kt = k, ns{}, max{}, maxt{};
    for (int i = 0; i < vct.size(); )
    {
        maxt = 0;
        ns = vct[i];
        kt = k;
 
        for (int j = i; j < vct.size() && kt > -1; ++j)
        {
            if (ns == vct[j])
                ++maxt;
            else
                --kt;
        }
        max = std::max(max, maxt);
        while (i < vct.size() && vct[i] == ns)
        {
            ++i;
        }
    }
    return max;
}
 
SWin SlidingWin( const std::vector<int> & data, const int maxK )
{
    SWin maxWin = { 0, 0, 1 };
    std::vector<int> vecNext(data.size());
    std::unordered_map<int, SWin> theMap;
    
    for (int i = 0; i < (int) data.size(); ++i) {
        
        // get current win
        SWin & sw = theMap[data[i]];
        if (!sw.count) {
            sw = { i, i, 1 };
            continue;
        }
 
        // maybe reset win
        int needDel = i - sw.end - 1;
        if (needDel > maxK) {
            sw = { i, i, 1 };
            continue;
        }
        
        int wasDel = sw.end - sw.beg - sw.count + 1;
        int delta = maxK - (wasDel + needDel);
        
        // maybe move left side
        while (delta < 0) {
            assert(sw.beg != sw.end);
            int nxt = vecNext[sw.beg];
            delta += nxt - sw.beg - 1;
            sw.beg = nxt;
            --sw.count;
        }
        
        // set new right side
        vecNext[sw.end] = i;
        sw.end = i;
        ++sw.count;
        
        // fix max
        if (sw.count > maxWin.count)
            maxWin = sw;
    }
    
    return maxWin;
}
 
int main()
{
    int const cnt = (int)1e4; // размер массива
    std::vector<int> vct(cnt); // массив
    std::mt19937 eng{ (unsigned)time(nullptr) };
    int uidMin = 1, uidMax = 100;
    if (uidMax >= cnt)
        throw;
    std::uniform_int_distribution<int> uid{ uidMin, uidMax };
    
    const int maxPass = 1000;
    for (int pass = 0; pass < maxPass; ++pass)
    {
        int k;
        if (pass < 2) {
            vct = { 2, 4, 4, 2, 1, 4, 2, 4 };
            k = pass ? 3 : 2;
        }
        else {
            vct.resize(cnt);
            for (auto& val : vct)
                val = uid(eng); // рандомно заполняем массив
            k = uid(eng); // число k
        }
        
        int maxLin = linear(vct, k);
        int maxQuad = quadratic(vct, k);
 
        printf("pass %d of %d\n", pass, maxPass);
        std::cout << "k = " << k << "  " << maxLin << " == " << maxQuad << "\n";
        if (maxLin != maxQuad) {
            printf("maxLin != maxQuad\n");
            return -1;
        }
 
        auto sw = SlidingWin(vct, k);
        printf("k = %d, count = %d, [%d] = [%d] = %d\n\n",
               k, sw.count, sw.beg, sw.end, vct[sw.beg]);
        if (sw.count != maxQuad) {
            printf("result mismatch\n");
            return -1;
        }
    }
}
Цитата Сообщение от igorrr37 Посмотреть сообщение
Одна работает за квадратичное время, вторая за линейное.
В обоих случаях Вы расширяете окно вправо "до упора"
C++
1
for (; j < vct.size() && kt >= 0; ++j)
И минимальная сложность получается O(n * k). Что впрочем вполне приемлемо для многих случаев

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от gunslinger Посмотреть сообщение
Вот код от GPT-4o mini:
Круто (червона рута). Только вот почему не работает и что с этим делать?
Цитата Сообщение от gunslinger Посмотреть сообщение
Проверьте, если хотите.
Ну да, ну да, Вам самими проверять недосуг, наверно очень заняты

1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,325
15.02.2026, 22:26
Цитата Сообщение от Royal_X Посмотреть сообщение
неплохо было бы сперва создать файл с входными и выходными данными для проверки корректности работы программы.
Я же предложил ГСЧ, который выдает одинаковые последовательности для заполнения массива.

Добавлено через 59 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
а если они обе дают неверные ответы?
Моя даёт такой же ответ.
0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
16.02.2026, 00:56
Цитата Сообщение от Igor3D Посмотреть сообщение
И минимальная сложность получается O(n * k)
В случае линейной ф-ции окно расширяется только вправо и никогда не откатывается назад так что сложность всё таки линейная, она быстро работает и при n=10^8, квадратичная так не сможет(при больших k)
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,138
Записей в блоге: 2
16.02.2026, 01:18
Цитата Сообщение от igorrr37 Посмотреть сообщение
В случае линейной ф-ции окно расширяется только вправо и никогда не откатывается назад так что сложность всё таки линейная, она работает и при n=10^8
Зависимость от n линейная, т.е. вдвое больший vct будет обрабатываться вдвое большее время, при фиксированном k. Но общая сложность O(n * k) достаточно трудоемка, напр при к = 1024 и более тормоза станут заметны. Свести дело к (почти) чистому O(n) возможно (SlidingWin), хотя и требует больше памяти
0
 Аватар для igorrr37
2897 / 2044 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
16.02.2026, 01:57
Цитата Сообщение от Igor3D Посмотреть сообщение
при фиксированном k
при любом k. Так как окно растёт только вправо то добавляется всего один проход по массиву за весь цикл работы программы

Добавлено через 32 минуты
Цитата Сообщение от Igor3D Посмотреть сообщение
Свести дело к (почти) чистому O(n) возможно (SlidingWin)
да, работают с одинаковой скоростью. Просто у вас запоминает в unordered_map а у меня в вектор
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,138
Записей в блоге: 2
16.02.2026, 17:53
Цитата Сообщение от Igor3D Посмотреть сообщение
В обоих случаях Вы расширяете окно вправо "до упора"
...
И минимальная сложность получается O(n * k).
Здесь я был неправ, O(n * k) получается только во втором случае (что Вы называете "квадратичным"). В первом же, действительно, все линейно O(n). Правда такое решение не очень практично. Напр чуть другая формулировка задачи "какие эл-ты надо удалить". Но все равно - красивое, неочевидное (во всяком случае для меня) решение
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
20.02.2026, 14:39
Нашел (через нейросеть), где можно протестировать код для этой задачи (2831. Find the Longest Equal Subarray):
https://leetcode.com/problems/... scription/
Там, правда, ограничение 10^5, а не 10^6. Ну и регистрация, конечно, нужна.
You are given a 0-indexed integer array nums and an integer k.
A subarray is called equal if all of its elements are equal. Note that the empty subarray is an equal subarray.
Return the length of the longest possible equal subarray after deleting at most k elements from nums.
A subarray is a contiguous, possibly empty sequence of elements within an array.


Example 1:

Input: nums = [1,3,2,3,1,3], k = 3
Output: 3
Explanation: It's optimal to delete the elements at index 2 and index 4.
After deleting them, nums becomes equal to [1, 3, 3, 3].
The longest equal subarray starts at i = 1 and ends at j = 3 with length equal to 3.
It can be proven that no longer equal subarrays can be created.

Example 2:

Input: nums = [1,1,2,2,1,1], k = 2
Output: 4
Explanation: It's optimal to delete the elements at index 2 and index 3.
After deleting them, nums becomes equal to [1, 1, 1, 1].
The array itself is an equal subarray, so the answer is 4.
It can be proven that no longer equal subarrays can be created.


Constraints:

1 <= nums.length <= 10^5
1 <= nums[i] <= nums.length
0 <= k <= nums.length
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2026, 14:39

Найти самый длинный подмассив, который является арифметической прогрессией
Известно, что в целочисленном массиве X=(x1, x2, ..., xn) три и только три числа равны между собой, остальные не повторяются. Найти самый...

Определить самый длинный ряд одинаковых элементов последовательности
Вводится последовательность цифр, 0 – конец ввода. Определить самый длинный ряд одинаковых цифр. Например: пользователь ввел: 1 2 2 2 3 1...

В целочисленном массиве А(80) найти самый длинный подмассив, который является арифметической прогрессией
Здравствуйте) Начинаю кодить на С++ и в нем не совсем шарю Задание: В целочисленном массиве Х(80) найти самый длинный подмассив,...

Извлечь с удалением из массива подмассив
приветствую есть код for ($i = 1; $i &lt;= 3; $i++) { $trnd=$opnnn; $opnnn=array_diff($opnnn,$trnd); } print_r($trnd); ...

Даны два одномерных массива целых чисел (массив А, состоящий из n элементов, массив В, состоящий из m элементов),
Язык: Pascal. Даны два одномерных массива целых чисел (массив А, состоящий из n элементов, массив В – из m элементов), заполненных ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru