n个范围内出现的最大整数

鉴于 N 表格的范围 L R ,任务是找到所有范围内出现的最大整数。如果存在多个这样的整数,请打印最小的一个。 0<=L R < 1000000. 例如:

null
Input : L1 = 1 R1 = 15        L2 = 4 R2 = 8        L3 = 3 R3 = 5        L4 = 1 R4 = 4Output : 4Input : L1 = 1 R1 = 15        L2 = 5 R2 = 8        L3 = 9 R3 = 12        L4 = 13 R4 = 20        L5 = 21 R5 = 30Output : 5Numbers having maximum occurrence i.e 2  are 5, 6,7, 8, 9, 10, 11, 12, 13, 14, 15. The smallest numberamong all are 5.

我们穿过所有的山脉。然后,我们计算每个范围的频率,制作一个哈希表或哈希映射,存储每个项目。然后你穿过其他范围,增加每一项的频率。频率最高的项目是我们的答案。但是这个解决方案需要时间,比如说有N个范围,如果M是任何范围内元素的最大数量,那么需要O(N*M)时间。哈希表的插入、搜索和删除的时间复杂度为O(1)。因此,您可以插入哈希表中的每一项,并将其频率设置为O(1)。

有效率的 方法:-时间复杂度O(N+max)

如果范围是固定的,比如(0<=Li,Ri<1000000),我们可以在更好的时间复杂度下实现这一点。这里的诀窍是我们不想旅行每一个范围的每一个元素。我们只想遍历所有范围,我们想使用前缀和技术来解决这个问题。

我们创建一个vector/Arraylist/Array。向量中的所有值都用零初始化(使用向量或数组列表来避免C++中的MeSET)的额外行。在java中填充()。所以我们要做的是在每个范围内循环,并标记每个范围的开头。我们只是这么做 arr[L[i]]++ .我们还通过从中减去一来标记这个范围的结束 arr[R[i+1]] .

正如我之前所讨论的,我们将每个范围的开始标记为一。

所以如果我做一个前缀和,如果我标记开始,所有的值都会在这个元素之后增加一。现在我们只想增加到数组的末尾。我们不想增加其他元素。

比如说,

L[]={1,2,3},R[]={3,5,7}

1.对于这条线arr[L[i]++数组变成{0,1,1,0,0,0,0,…}

2.对于这条线arr[R[i+1]——数组变成{0,1,1,1,-1,0,-1,0,-1,…}

3.当我们进行前缀求和时,数组变成{0,1,2,3,2,2,1,1,0…}

当我们使用前缀sum时,我们将使(1)之后的元素之和增加1,因为我标记了开头。现在我不希望这个增量发生在(3)之后的元素上。所以如果有一个范围1,2,3,1,2,3的值应该只增加1,或者它们的频率应该增加1。

这就是为什么我们降低了arr[R[i+1]]的值。所以这个范围结束后的元素的值减去1。这就是当我要做前缀时,我们如何消除增加值的影响。

所以,当我要做前缀时,我只需要增加范围后的每个值,因为我只想在范围内增加。这就是这个算法的想法。

C++

// C++ program to find maximum occurred element in
// given N ranges.
#include <bits/stdc++.h>
#define MAX 1000000
using namespace std;
// Return the maximum occurred element in all ranges.
int maximumOccurredElement( int L[], int R[], int n)
{
// Initialising all element of array to 0.
int arr[MAX];
memset (arr, 0, sizeof arr);
// Adding +1 at Li index and subtracting 1
// at Ri index.
int maxi=-1;
for ( int i = 0; i < n; i++) {
arr[L[i]] += 1;
arr[R[i] + 1] -= 1;
if (R[i]>maxi){
maxi=R[i];
}
}
// Finding prefix sum and index having maximum
// prefix sum.
int msum = arr[0],ind;
for ( int i = 1; i < maxi+1; i++) {
arr[i] += arr[i - 1];
if (msum < arr[i]) {
msum = arr[i];
ind = i;
}
}
return ind;
}
// Driven Program
int main()
{
int L[] = { 1, 4, 9, 13, 21 };
int R[] = { 15, 8, 12, 20, 30 };
int n = sizeof (L) / sizeof (L[0]);
cout << maximumOccurredElement(L, R, n) << endl;
return 0;
}


JAVA

// Java program to find maximum occurred
// element in given N ranges.
import java.io.*;
class GFG {
static int MAX = 1000000 ;
// Return the maximum occurred element in all ranges.
static int maximumOccurredElement( int [] L, int [] R, int n)
{
// Initialising all element of array to 0.
int [] arr = new int [MAX];
// Adding +1 at Li index and
// subtracting 1 at Ri index.
int maxi=- 1 ;
for ( int i = 0 ; i < n; i++) {
arr[L[i]] += 1 ;
arr[R[i] + 1 ] -= 1 ;
if (R[i]>maxi){
maxi=R[i];
}
}
// Finding prefix sum and index
// having maximum prefix sum.
int msum = arr[ 0 ];
int ind = 0 ;
for ( int i = 1 ; i < maxi+ 1 ; i++) {
arr[i] += arr[i - 1 ];
if (msum < arr[i]) {
msum = arr[i];
ind = i;
}
}
return ind;
}
// Driver program
static public void main(String[] args)
{
int [] L = { 1 , 4 , 9 , 13 , 21 };
int [] R = { 15 , 8 , 12 , 20 , 30 };
int n = L.length;
System.out.println(maximumOccurredElement(L, R, n));
}
}
// This code is contributed by vt_m.


Python3

# Python 3 program to find maximum occurred
# element in given N ranges.
MAX = 1000000
# Return the maximum occurred element
# in all ranges.
def maximumOccurredElement(L, R, n):
# Initialising all element of array to 0.
arr = [ 0 for i in range ( MAX )]
# Adding +1 at Li index and subtracting 1
# at Ri index.
for i in range ( 0 , n, 1 ):
arr[L[i]] + = 1
arr[R[i] + 1 ] - = 1
# Finding prefix sum and index
# having maximum prefix sum.
msum = arr[ 0 ]
for i in range ( 1 , MAX , 1 ):
arr[i] + = arr[i - 1 ]
if (msum < arr[i]):
msum = arr[i]
ind = i
return ind
# Driver Code
if __name__ = = '__main__' :
L = [ 1 , 4 , 9 , 13 , 21 ]
R = [ 15 , 8 , 12 , 20 , 30 ]
n = len (L)
print (maximumOccurredElement(L, R, n))
# This code is contributed by
# Sanjit_Prasad


C#

// C# program to find maximum
// occurred element in given N ranges.
using System;
class GFG {
static int MAX = 1000000;
// Return the maximum occurred element in all ranges.
static int maximumOccurredElement( int [] L, int [] R, int n)
{
// Initialising all element of array to 0.
int [] arr = new int [MAX];
// Adding +1 at Li index and
// subtracting 1 at Ri index.
for ( int i = 0; i < n; i++) {
arr[L[i]] += 1;
arr[R[i] + 1] -= 1;
}
// Finding prefix sum and index
// having maximum prefix sum.
int msum = arr[0];
int ind = 0;
for ( int i = 1; i < MAX; i++) {
arr[i] += arr[i - 1];
if (msum < arr[i]) {
msum = arr[i];
ind = i;
}
}
return ind;
}
// Driver program
static public void Main()
{
int [] L = { 1, 4, 9, 13, 21 };
int [] R = { 15, 8, 12, 20, 30 };
int n = L.Length;
Console.WriteLine(maximumOccurredElement(L, R, n));
}
}
// This code is contributed by vt_m.


PHP

<?php
// PHP program to find maximum occurred
// element in given N ranges.
$MAX = 1000000;
// Return the maximum occurred element
// in all ranges.
function maximumOccurredElement( $L , $R , $n )
{
// Initialising all element
// of array to 0.
$arr = array ();
for ( $i = 0; $i < $n ; $i ++)
{
$arr [] = "0" ;
}
// Adding +1 at Li index and subtracting 1
// at Ri index.
for ( $i = 0; $i < $n ; $i ++)
{
$arr [ $L [ $i ]] += 1;
$arr [ $R [ $i ] + 1] -= 1;
}
// Finding prefix sum and index
// having maximum prefix sum.
$msum = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
{
$arr [ $i ] += $arr [ $i - 1];
if ( $msum < $arr [ $i ])
{
$msum = $arr [ $i ];
$ind = $i ;
}
}
return $ind ;
}
// Driver Code
$L = array (1, 4, 9, 13, 21);
$R = array (15, 8, 12, 20, 30);
$n = count ( $L );
echo maximumOccurredElement( $L , $R , $n );
// This code is contributed by
// Srathore
?>


Javascript

<script>
// JavaScript program to find maximum
// occurred element in given N ranges.
let MAX = 1000000;
// Return the maximum occurred element in all ranges.
function maximumOccurredElement(L, R, n)
{
// Initialising all element of array to 0.
let arr = new Array(MAX);
arr.fill(0);
// Adding +1 at Li index and
// subtracting 1 at Ri index.
for (let i = 0; i < n; i++) {
arr[L[i]] += 1;
arr[R[i] + 1] -= 1;
}
// Finding prefix sum and index
// having maximum prefix sum.
let msum = arr[0];
let ind = 0;
for (let i = 1; i < MAX; i++) {
arr[i] += arr[i - 1];
if (msum < arr[i]) {
msum = arr[i];
ind = i;
}
}
return ind;
}
let L = [ 1, 4, 9, 13, 21 ];
let R = [ 15, 8, 12, 20, 30 ];
let n = L.length;
document.write(maximumOccurredElement(L, R, n));
</script>


输出:

4

时间复杂性: O(n+最大值)

练习: 尝试0<=L R <= 1000000000. (提示:使用stl映射)。 相关文章: m范围增量运算后数组中的最大值 本文由 凯尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享