считать отдельные кусочки в массиве

Я пытался решить этот проблема.

Целое число M и непустой индексированный с нуля массив A, состоящий из N
даны неотрицательные целые числа. Все целые числа в массиве А меньше
или равно М.

Пара целых чисел (P, Q), такая, что 0 ≤ P ≤ Q < N, называется ломтик
массива А. Срез состоит из элементов A [P], A [P + 1], …,
А [Q]. Отдельный срез — это срез, состоящий только из уникальных чисел.
То есть, ни один отдельный номер не встречается более одного раза в срезе.

Например, рассмотрим целое число M = 6 и массив A такой, что:

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

Существует ровно девять различных срезов: (0, 0), (0, 1), (0, 2), (1,
1), (1,2), (2, 2), (3, 3), (3, 4) и (4, 4).

Цель состоит в том, чтобы рассчитать количество отдельных срезов.

Заранее спасибо.

#include <algorithm>
#include <cstring>
#include <cmath>
#define MAX 100002

// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

using namespace std;

bool check[MAX];

int solution(int M, vector<int> &A) {
memset(check, false, sizeof(check));
int base = 0;
int fibot = 0;
int sum = 0;

while(fibot < A.size()){

if(check[A[fibot]]){
base = fibot;
}

check[A[fibot]] = true;

sum += fibot - base + 1;
fibot += 1;
}

return min(sum, 1000000000);
}

5

Решение

Решение не правильное, потому что ваш алгоритм неверен.

Прежде всего, позвольте мне показать вам контрпример. Позволять A = {2, 1, 2}, Первая итерация: base = 0, fibot = 0, sum += 1. Вот так. Второй: base = 0, fibot = 1, sum += 2, Это тоже правильно. Последний шаг: fibot = 2, check[A[fibot]] is trueтаким образом, base = 2, Но это должно быть 1, Итак, ваш код возвращается1 + 2 + 1 = 4 пока правильный ответ 1 + 2 + 2 = 5,

Правильный способ сделать это может быть так: начните с L = 0, Для каждого R от 0 в n - 1двигай L вправо, пока подмассив не будет содержать только отдельные значения (вы можете поддерживать количество вхождений каждого значения в массиве и использовать тот факт, что A[R] это единственный элемент, который может встречаться более одного раза).

Есть еще одна проблема с вашим кодом: sum переменная может переполниться, если int 32-битный тип на платформе тестирования (например, если все элементы A различны).

Что касается вопроса, ПОЧЕМУ ваш алгоритм неверен, я понятия не имею, почему он должен быть правильным в первую очередь. Ты можешь доказать это? base = fibot назначение выглядит совершенно произвольным для меня.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]