给定一个由N个整数组成的数组。将有Q个查询,每个查询包含形式为q和x的两个整数,0 <= q <=1。查询有两种类型:
- 在第一个查询(q = 0)中,任务是查找不小于x(或大于或等于x)的整数计数。
- 在第二个查询(q = 1)中,任务是查找大于x的整数计数。
例子:
Input : arr[] = { 1, 2, 3, 4 } and Q = 3
Query 1: 0 5
Query 2: 1 3
Query 3: 0 3
Output :0
1
2
Explanation:
x = 5, q = 0 : There are no elements greater than or equal to it.
x = 3, q = 1 : There is one element greater than 3 which is 4.
x = 3, q = 0 : There are two elements greater than or equal to 3.
方法1:对于每个查询,可以采用一种朴素的方法,遍历整个数组并计算小于或大于x的整数,具体取决于q。这种方法的时间复杂度将是O(Q * N) 。
方法2:一种有效的方法是对数组进行排序,并对每个查询使用二进制搜索。这将采用O(NlogN + QlogN) 。
以下是此方法的实现:
C++
// C++ to find number of integer less or greater given
// integer queries
#include
using namespace std;
// Return the index of integer which are not less than x
// (or greater than or equal to x)
int lower_bound(int arr[], int start, int end, int x)
{
while (start < end)
{
int mid = (start + end)>>1;
if (arr[mid] >= x)
end = mid;
else
start = mid + 1;
}
return start;
}
// Return the index of integer which are greater than x.
int upper_bound(int arr[], int start, int end, int x)
{
while (start < end)
{
int mid = (start + end)>>1;
if (arr[mid] <= x)
start = mid + 1;
else
end = mid;
}
return start;
}
void query(int arr[], int n, int type, int x)
{
// Counting number of integer which are greater than x.
if (type)
cout << n - upper_bound(arr, 0, n, x) << endl;
// Counting number of integer which are not less than x
// (Or greater than or equal to x)
else
cout << n - lower_bound(arr, 0, n, x) << endl;
}
// Driven Program
int main()
{
int arr[] = { 1, 2, 3, 4 };
int n = sizeof(arr)/sizeof(arr[0]);
sort(arr, arr + n);
query(arr, n, 0, 5);
query(arr, n, 1, 3);
query(arr, n, 0, 3);
return 0;
}
Java
// Java to find number of integer
// less or greater given
// integer queries
import java.util.Arrays;
class GFG
{
// Return the index of integer
// which are not less than x
// (or greater than or equal
// to x)
static int lower_bound(int arr[], int start,
int end, int x)
{
while (start < end)
{
int mid = (start + end)>>1;
if (arr[mid] >= x)
end = mid;
else
start = mid + 1;
}
return start;
}
// Return the index of integer
// which are greater than x.
static int upper_bound(int arr[], int start, int end, int x)
{
while (start < end)
{
int mid = (start + end)>>1;
if (arr[mid] <= x)
start = mid + 1;
else
end = mid;
}
return start;
}
static void query(int arr[], int n, int type, int x)
{
// Counting number of integer
// which are greater than x.
if (type==1)
System.out.println(n - upper_bound(arr, 0, n, x));
// Counting number of integer which
// are not less than x (Or greater
// than or equal to x)
else
System.out.println(n - lower_bound(arr, 0, n, x));
}
// Driver code
public static void main (String[] args)
{
int arr[] = { 1, 2, 3, 4 };
int n = arr.length;
Arrays.sort(arr);
query(arr, n, 0, 5);
query(arr, n, 1, 3);
query(arr, n, 0, 3);
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python3 program to find number of integer
# less or greater given integer queries
# Return the index of integer
# which are not less than x
# (or greater than or equal to x)
def lower_bound(arr, start, end, x):
while (start < end):
mid = (start + end) >> 1
if (arr[mid] >= x):
end = mid
else:
start = mid + 1
return start
# Return the index of integer
# which are greater than x.
def upper_bound(arr, start, end, x):
while (start < end):
mid = (start + end) >> 1
if (arr[mid] <= x):
start = mid + 1
else:
end = mid
return start
def query(arr, n, type, x):
# Counting number of integer
# which are greater than x.
if (type == 1):
print(n - upper_bound(arr, 0, n, x))
# Counting number of integer
# which are not less than x
# (Or greater than or equal to x)
else:
print(n - lower_bound(arr, 0, n, x))
# Driver code
arr = [ 1, 2, 3, 4 ]
n =len(arr)
arr.sort()
query(arr, n, 0, 5)
query(arr, n, 1, 3)
query(arr, n, 0, 3)
# This code is contributed by Anant Agarwal.
C#
// C# to find number of integer less
// or greater given integer queries
using System;
class GFG {
// Return the index of integer which are
// not less than x (or greater than or
// equal to x)
static int lower_bound(int []arr, int start,
int end, int x)
{
while (start < end)
{
int mid = (start + end)>>1;
if (arr[mid] >= x)
end = mid;
else
start = mid + 1;
}
return start;
}
// Return the index of integer
// which are greater than x.
static int upper_bound(int []arr, int start,
int end, int x)
{
while (start < end)
{
int mid = (start + end)>>1;
if (arr[mid] <= x)
start = mid + 1;
else
end = mid;
}
return start;
}
static void query(int []arr, int n, int type, int x)
{
// Counting number of integer
// which are greater than x.
if (type==1)
Console.WriteLine(n - upper_bound(arr, 0, n, x));
// Counting number of integer which
// are not less than x (Or greater
// than or equal to x)
else
Console.WriteLine(n - lower_bound(arr, 0, n, x));
}
// Driver code
public static void Main ()
{
int []arr = {1, 2, 3, 4};
int n = arr.Length;
Array.Sort(arr);
query(arr, n, 0, 5);
query(arr, n, 1, 3);
query(arr, n, 0, 3);
}
}
// This code is contributed by vt_m.
PHP
> 1;
if ($arr[$mid] >= $x)
$end = $mid;
else
$start = $mid + 1;
}
return $start;
}
// Return the index of integer
// which are greater than x.
function upper_bound($arr, $start, $end, $x)
{
while ($start < $end)
{
$mid = ($start + $end) >> 1;
if ($arr[$mid] <= $x)
$start = $mid + 1;
else
$end = $mid;
}
return $start;
}
function query($arr, $n, $type, $x)
{
// Counting number of integer
// which are greater than x.
if ($type)
echo $n - upper_bound($arr, 0, $n, $x) ,"\n";
// Counting number of integer
// which are not less than x
// (Or greater than or equal to x)
else
echo $n - lower_bound($arr, 0, $n, $x) ,"\n";
}
// Driver Code
$arr = array(1, 2, 3, 4);
$n = count($arr);
sort($arr);
query($arr, $n, 0, 5);
query($arr, $n, 1, 3);
query($arr, $n, 0, 3);
// This code is contributed by anuj_67.
?>
Javascript
输出:
0
1
2
时间复杂度: O((N + Q)* logN)。