Если массив отсортирован, можно использовать жадный алгоритм.Я также предполагаю, что все числа на входе положительны.
Рассмотрим следующие шаги:
1. Int cover = -1, points= new array
2. For each element in the array:
2.1 . If element > cover then:
2.1.1 cover = element + range - 1 // biggest value that still cover the element
2.1.2 push to point cover value
Массив точек будет содержать точки мимия, необходимые для покрытия массива для данного диапазона
Сложность : предполагается, что n - это размер входного массива:
Сложность по времени составляет O (n), если массив отсортирован, и O (nlogn), если нет.Сложность пространства равна O (k), когда k - количество точек покрытия, ограниченных n.Если вам нужно только количество точек, то сложность пространства равна O (1)
Если точки можно выбрать только из массива, вы можете изменить алгоритм следующим образом:
1. Int cover = -1, points= new array
2. For each i in the array.length:
2.1 If array[i] > cover then:
2.1.1 cover = array[i] //element can cover itself
2.1.2 for (j=i+1; array[j] < array[i] + range; j++) // find the largest element who still cover array[i]
2.1.2.1 cover = array[j] // element in index j cover also index i
2.1.3 push to point cover value
2.1.4 add range to cover // to mark for cover after a[j]
Пространственная сложность одинакова.Временная сложность также равна O (n) - поскольку каждый шаг внутреннего цикла (j) выполняет i-цикл, мы не выполняем условие оператора if - поэтому мы остаемся с O (n).