C++ 在c+中超出了内存限制+; int解决方案::求解(向量&A) { 排序(A.begin(),A.end()); mapma; int m; 对于(int i=0;i

C++ 在c+中超出了内存限制+; int解决方案::求解(向量&A) { 排序(A.begin(),A.end()); mapma; int m; 对于(int i=0;i,c++,arrays,C++,Arrays,无需使用map。排序后,只需从数组末尾开始,对元素进行计数,并将此计数与即将到来的元素进行比较 更新:更好-按降序对数组进行排序,并检查是否有任何元素与其索引相等。无需使用map。排序后,只需从数组末尾开始,对元素进行计数,并将此计数与即将到来的元素进行比较 更新:更好-按降序对数组进行排序,并检查是否有任何元素等于其索引。这个问题背后的思想是如何在不使用任何额外内存的情况下计算出数组中有多少项大于给定值 一旦数组被排序,这很容易做到:从数组大小中减去当前基于一的位置即可得到答案 因此,您可以通

无需使用map。排序后,只需从数组末尾开始,对元素进行计数,并将此计数与即将到来的元素进行比较


更新:更好-按降序对数组进行排序,并检查是否有任何元素与其索引相等。

无需使用map。排序后,只需从数组末尾开始,对元素进行计数,并将此计数与即将到来的元素进行比较


更新:更好-按降序对数组进行排序,并检查是否有任何元素等于其索引。

这个问题背后的思想是如何在不使用任何额外内存的情况下计算出数组中有多少项大于给定值

一旦数组被排序,这很容易做到:从数组大小中减去当前基于一的位置即可得到答案

因此,您可以通过对数组排序,然后遍历它一次,并检查每个位置的
a[i]==a.size()-i-1
来解决此问题


注意:如果允许数组中的数字相等,问题可能会变得更难。在这种情况下,您需要在检测到相等范围的开始后继续向上遍历数组。

此问题背后的思想是如何在不使用任何附加值的情况下计算出数组中有多少项大于给定值记忆

一旦数组被排序,这很容易做到:从数组大小中减去当前基于一的位置即可得到答案

因此,您可以通过对数组排序,然后遍历它一次,并检查每个位置的
a[i]==a.size()-i-1
来解决此问题


注意:如果允许数组中的数字相等,问题可能会变得更难。在这种情况下,您需要在检测到相等范围的开始后继续向上遍历数组。

将第N个元素与二进制搜索相结合,可能会得到平均为O(N)的结果(~2N+logN)

完全未经测试的代码:

int Solution::solve(vector<int> &A)
{
    sort(A.begin(), A.end());
    map<int, int>ma;
    int m;
    for (int i = 0; i<A.size(); i++)
        ma[A[i]] = 1;
    for (int i = 0; i<A.size(); i++)
        ma[A[i]]++;
    if (A.size() == 1 && A[0] == 0)
        return 1;
    if (ma[A[0]] == (A.size() + 1))
        return -1;
    for (int i = 0; i<A.size(); i++)
    {
        if (ma[A[i]]>2 && ma[A[i]]>0)
        {
            m = A.size() - (i + 1) - (ma[A[i]] - 2);
            ma[A[i]] = -1;

        }
        if (ma[A[i]] == 2)
            m = A.size() - (i + 1);
        if (m == A[i])
        {

            return 1;
        }
    }
    return -1;
}
auto start=v.begin();
自动结束=v.结束();
while(开始!=最后一次){
自动对半=(标准::距离(起点、终点)/2);
自动中位数=开始+一半;
标准:第n个元素(开始、中间、最后);
自动均值=*中位数;
如果(平均值>一半){
如果(*中间值>标准::距离(中间值,v.端点())
return-1;//提前退出
last=中位数;
}否则{
如果(*中间值<标准::距离(中间值,v.端点())
return-1;//提前退出
起点=中间值;
}     
}
如果(*开始==标准::距离(开始,v.结束())
返回1;
返回-1;

Todo:test,test和check-off通过一个

将第N个元素与二进制搜索相结合,可能会得到平均为O(N)的结果(~2N+logN)

完全未经测试的代码:

int Solution::solve(vector<int> &A)
{
    sort(A.begin(), A.end());
    map<int, int>ma;
    int m;
    for (int i = 0; i<A.size(); i++)
        ma[A[i]] = 1;
    for (int i = 0; i<A.size(); i++)
        ma[A[i]]++;
    if (A.size() == 1 && A[0] == 0)
        return 1;
    if (ma[A[0]] == (A.size() + 1))
        return -1;
    for (int i = 0; i<A.size(); i++)
    {
        if (ma[A[i]]>2 && ma[A[i]]>0)
        {
            m = A.size() - (i + 1) - (ma[A[i]] - 2);
            ma[A[i]] = -1;

        }
        if (ma[A[i]] == 2)
            m = A.size() - (i + 1);
        if (m == A[i])
        {

            return 1;
        }
    }
    return -1;
}
auto start=v.begin();
自动结束=v.结束();
while(开始!=最后一次){
自动对半=(标准::距离(起点、终点)/2);
自动中位数=开始+一半;
标准:第n个元素(开始、中间、最后);
自动均值=*中位数;
如果(平均值>一半){
如果(*中间值>标准::距离(中间值,v.端点())
return-1;//提前退出
last=中位数;
}否则{
如果(*中间值<标准::距离(中间值,v.端点())
return-1;//提前退出
起点=中间值;
}     
}
如果(*开始==标准::距离(开始,v.结束())
返回1;
返回-1;

todo:测试,检查和检查,如果你正在寻找关于工作代码的反馈,考虑在这里发布。你不应该在这里问这个问题。为什么你需要地图?在排序从结束开始。最后的值没有成员比它大-所以它应该是0匹配条件。下一个应该是1,下一个应该是2……直到YO。u找到匹配或丰富的索引0。什么是内存限制?@ AtyyvySotoSkymap用于跟踪重复元素,如果你正在寻找关于工作代码的反馈,考虑在这里发布。你不应该在这里问这个问题!为什么你需要地图?在排序从结束开始。最后的值没有比它大的成员-所以它应该d为0以匹配条件。下一个应为1,下一个应为2…直到找到匹配项或丰富索引0。内存限制是多少?@ArtemyVysotsky映射用于跟踪重复元素,如果any@Mohsen_Fatemi通过不使用额外内存优化代码-它如何不回答问题?@Mohsen_Fatemi通过n优化代码ot使用额外内存-它如何不回答问题?