Вам нужно выполнить два бинарных поиска, чтобы найти самый низкий индекс перед диапазономLow и наивысшим индексом после rangeHigh, таким образом вы можете подсчитать дубликаты в пределах диапазона.
Это даст временную сложность o ( 2 log n), поскольку мы дважды выполняем двоичный поиск.
private int searchArrayForNumbersInRange(int[] arr, int start, int end) {
int leftIndex = searchLeft(arr, start);
int rightIndex = searchRight(arr, end);
int count;
if (leftIndex < 0 || rightIndex < 0)
return -1;
if (rightIndex == leftIndex)
count = 1;
else {
count = rightIndex - leftIndex;
}
return count;
}
private int searchLeft(int[] arr, int start) {
int lo = 0;
int hi = arr.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (arr[mid] == start && arr[mid -1] < start) {
return mid - 1;
}
if (arr[mid] >= start)
hi = mid - 1;
else
lo = mid + 1;
}
return -1;
}
private int searchRight(int[] arr, int end) {
int lo = 0;
int hi = arr.length -1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (arr[mid] == end && arr[mid+1] > end)
return mid;
if (mid <= end)
lo = mid + 1;
else
hi = mid - 1;
}
return -1;
}
Согласно документации https://jqueryvalidation.org/rules/ функция add в
$('.validating').rules('add', {
number: true,
messages: {
number: "Введите цифры"
},
});
добавит правила для элемента AN, в вашем случае только к первому может быть. Следовательно, они используют идентификатор в документации ...
первая версия вашего кода должна это сделать:
$('form').validate({
rules: {
price_from: {
number: true
},
price_to: {
number: true
}
},
messages: {
price_from: {
number: "Введите цифры"
},
price_to: {
number: "Введите цифры"
}
},
errorElement: "div",
errorPlacement: function(error, element) {
$('.error-messages').append(error);
},
submitHandler: function() {
this.successList.map(function(field){
console.log($(field).attr("name"), $(field).val())
})
console.log("Таблица успешно обновлена!")
}
});
.wrapper {
width: 50%;
margin: 0 auto;
}
.price-filter {
text-align: center;
margin-bottom: 10px;
height: auto;
}
form {
width: 100%;
}
.price-filter input {
border: 1px solid #000000;
outline: none;
}
.error-messages {
color: red;
margin-top: 5px;
}
input.error {
border: 2px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.0/jquery.validate.js"></script>
<div class="price-filter wrapper">
<form action="/" name="form">
<label>Цена от:</label>
<input class="price-from validating" name="price_from" type="text" placeholder="0">
<label>до:</label>
<input class="price-to validating" name="price_to" type="text" placeholder="10000">
<input class="refresh" type="submit" value="Обновить">
<div class="error-messages"></div>
</form>
</div>
Я решил свою проблему следующим образом:
$('form').validate({
errorElement: "div",
errorPlacement: function(error, element) {
$('.error-messages').append(error);
},
submitHandler: function() {
console.log("Таблица успешно обновлена!")
}
});
$('.validating').each(function() {
$(this).rules('add', {
number: true,
messages: {
number: "Введите цифры"
},
});
});
Вот пример: https://jsfiddle.net/waLgfv6m/