Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解决领导者的挑战_Javascript_Algorithm - Fatal编程技术网

Javascript 如何解决领导者的挑战

Javascript 如何解决领导者的挑战,javascript,algorithm,Javascript,Algorithm,在找到“leader”后,我尝试在给定数组中找到可能的equalleader,但没有找到。我试图找到其他人的解决办法,但对他所做的事却束手无策 我在他的代码中丢失的部分留下了评论。有人能帮我看完这部分吗。尤其是那些计算 这就是他的解决方案 function solution(A) { // I understand this part as he was trying to find the leader if (A.length === 1) return 0 let

在找到“leader”后,我尝试在给定数组中找到可能的equalleader,但没有找到。我试图找到其他人的解决办法,但对他所做的事却束手无策

我在他的代码中丢失的部分留下了评论。有人能帮我看完这部分吗。尤其是那些计算

这就是他的解决方案

function solution(A) {
    // I understand this part as he was trying to find the leader
    if (A.length === 1) return 0
    let maxRepetition = 1;
    let maxIndex = -1
    let occurance = new Object()
    for (let i = 0; i < A.length; i++) {
        if (occurance.hasOwnProperty(A[i])) {
            occurance[A[i]][0]++
            if (occurance[A[i]][0] > maxRepetition) {
                if (occurance[A[i]][0] > A.length / 2) {
                    maxRepetition = occurance[A[i]][0]
                    maxIndex = occurance[A[i]][1]
                }
            }
        }
        else {
            occurance[A[i]] = new Array()

            occurance[A[i]][0] = 1
            occurance[A[i]][1] = i
        }
    }

    leader = A[maxIndex]


    // THis is the part I am not getting where he was trying to get the possible equiLeaders

    let equiLeader = 0
    let stack = []
    let stackIndex = -1
    for (let i = 0; i < A.length; i++) {

        if (stack.length > (Math.floor(i / 2)) && (maxRepetition - stack.length > Math.floor((A.length - i) / 2))) {
            equiLeader++
        }
        if (A[i] === leader) stack.push(i)

    }


    return equiLeader

}
目标是统计equi领导者的数量

编写一个函数:

function solution(A);
给定一个由N个整数组成的非空数组a,返回 平等领导者的数量

例如,假设: A[0]=4 A[1]=3 A[2]=4 A[3]=4 A[4]=4 A[5]=2

函数应该返回2,如上所述

为以下假设编写有效的算法:

    N is an integer within the range [1..100,000];
    each element of array A is an integer within the range [−1,000,000,000..1,000,000,000].

我想我们都同意,最难理解的部分是这一部分

if (stack.length > (Math.floor(i / 2)) &&
   (maxRepetition - stack.length > Math.floor((A.length - i) / 2))) {
        equiLeader++
   }
我将把
maxreption
重命名为
countOfLeadingValues
,因为它是整个数组/列表中存在的前导值的数量。举个简单的例子

[2,4,4,4,4,4,6]
然后
countOfLeadingValues==5

我也要搬家了

if (A[i] === leader) stack.push(i)
在问题线之上,因为这样做更有意义。当当前元素等于leader值时(在本例4中),我们将推送到堆栈

看看第一个条件

stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
这里发生的事情是,我们确保当前堆栈中至少有一半的元素等于前导值(即,否则它就不会是equileader)

所以

将为false(如果4是数组中的前导值)

但是

将为true(如果4是数组中的前导值),因此这将是一个等前导值,因为它的主导值也是前导值

在第二种情况下

stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
在左手边

countOfLeadingValues - stack.length
当我们遍历数组/列表时,将逐渐变小,因为第一个项是常量(示例中为5),第二个项随着每个equileader匹配(每个元素为4)而递增。我们要检查堆栈是否还没有达到前导值的总数

然后

当我们接近阵列末端时,将逐渐变大。我们还没有完成阵列的一半,因此我们将尽可能高效,而不是穷尽。从Codibility学习材料中:

如果大于n/2,则我们找到了领导者;否则,序列不包含引线


我想我们都同意,最难理解的部分是这一部分

if (stack.length > (Math.floor(i / 2)) &&
   (maxRepetition - stack.length > Math.floor((A.length - i) / 2))) {
        equiLeader++
   }
我将把
maxreption
重命名为
countOfLeadingValues
,因为它是整个数组/列表中存在的前导值的数量。举个简单的例子

[2,4,4,4,4,4,6]
然后
countOfLeadingValues==5

我也要搬家了

if (A[i] === leader) stack.push(i)
在问题线之上,因为这样做更有意义。当当前元素等于leader值时(在本例4中),我们将推送到堆栈

看看第一个条件

stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
这里发生的事情是,我们确保当前堆栈中至少有一半的元素等于前导值(即,否则它就不会是equileader)

所以

将为false(如果4是数组中的前导值)

但是

将为true(如果4是数组中的前导值),因此这将是一个等前导值,因为它的主导值也是前导值

在第二种情况下

stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
在左手边

countOfLeadingValues - stack.length
当我们遍历数组/列表时,将逐渐变小,因为第一个项是常量(示例中为5),第二个项随着每个equileader匹配(每个元素为4)而递增。我们要检查堆栈是否还没有达到前导值的总数

然后

当我们接近阵列末端时,将逐渐变大。我们还没有完成阵列的一半,因此我们将尽可能高效,而不是穷尽。从Codibility学习材料中:

如果大于n/2,则我们找到了领导者;否则,序列不包含引线

在C++中用100%。< /P>回答
int解决方案(向量&A){
//用C++14(g++6.2.0)编写代码
int leader,leadercnt=0,element=0,cnt=0,leaderfound=0,seq=0,候选者=0;
对于(uint i=0;i0)
{
候选者=元素;
leadercnt=cnt;
}
cnt=0;
对于(uint i=0;i(int)A.size()/2)
{
leaderfound=1;
领导=候选人;
leadercnt=cnt;
}
如果(leaderfound==0)
{
//printf(“返回0未找到任何引线\n”);
返回0;
}
int nonleadercnt=A.size()-leadercnt;
int无引线CNTL=0;
int leadercnt=leadercnt;
int leadercntl=0;
//printf(“找到了leader%d和leadercnt%d\n”,leader,leadercnt);
对于(uint i=0;i非领先NTL)和&(领先NTR>非领先NTR))
{
seq++;
}
}
返回顺序;
C++中的P><P>P>100%。
int解决方案(向量&A){
//用C++14(g++6.2.0)编写代码
int leader,leadercnt=0,element=0,cnt=0,leaderfound=0,seq=0,候选者=0;
对于(uint i=0;i0)
{
候选者=元素;
leadercnt=cnt;
}
cnt=0;
对于(uint i=0;i(int)A.size()/2)
{
leaderfound=1;
领导=候选人;
leadercnt=cnt;
}
如果(leaderfound==0)
{
//printf(“返回0未找到任何引线\n”);
返回0;
}
int nonleadercnt=A.size()-leadercnt;
int无引线CNTL=0;
int leadercnt=leadercnt;
int leadercntl=0;
//printf(“找到了leader%d和leadercnt%d\n”,leader,leadercnt);
对于(uint i=0;i非领先NTL)和&(领先NTR>非领先NTR))
{
seq++;
}
}
返回顺序;

}这是我的Java解决方案。结果100%和O(N)。 代码的第一部分是查找(如果有)数组中最频繁的数字(max)和num