Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Arrays 需要更有效的方式读取子阵列_Arrays_Algorithm_Loops_Coding Efficiency_Time Limiting - Fatal编程技术网

Arrays 需要更有效的方式读取子阵列

Arrays 需要更有效的方式读取子阵列,arrays,algorithm,loops,coding-efficiency,time-limiting,Arrays,Algorithm,Loops,Coding Efficiency,Time Limiting,问题陈述询问i

问题陈述询问i 我所做的:

我运行了一个从I=0到n-2的循环: 我使用的基本逻辑是,如果排序子数组中的前两个元素大于或等于最大值,那么所有对都将大于任何元素。每次我得到子数组时,我把下一个元素加入其中,然后再次设置这三个变量。Am通过15/20 TCs其他Am获得TLE:
约束条件:

1一个简单的方法是如下所示。你的逻辑是正确的,这就是我实现的。我改变了排序(NlogN),只通过一次(N)查找2个最小和最大的数字。我还没有编译代码,也不确定它是否能正常工作。它的总体复杂度为(N*N*N)

通过执行一些额外的检查,可以缩短执行时间:

  • min1+min2>=max
    可以在每个内部(k)循环后检查条件,如果违反单个情况,则断开
  • 如果子阵列4-7的条件不满足,则不需要检查包括4-7在内的任何其他子串。通过在每次循环之前存储违规案例并对其进行检查,可以提高总体执行时间

    int min1;
    int min2;
    int max;
    int count = 0;
    for(int i = 2; i < n; i++){
        for(int j = 0; j < i - 2; j++){
            max = -1;
            min1 = min2 = 1000000000;
            for(int k = j; k <= i; k++){
                if(inp[k] > max)
                    max = inp[k];
                if(inp[k] < min1){
                    min1 = inp[k];
                    continue;
                }
                if(inp[k] < min2){
                    min2 = inp[k];
                }
            }
            if(min1 + min2 >= max)
                count++;
        }
    } 
    
    intmin1;
    int min2;
    int max;
    整数计数=0;
    for(int i=2;i=最大值)
    计数++;
    }
    } 
    

可能存在一些错误,但以下是O(n log n)解决方案的总体思路:

我们保留了从startIdx到endIdx的元素窗口。如果它是一个有效的子数组,这意味着我们可以扩展它,我们可以向它添加另一个元素,所以我们增加endIdx。如果它无效,那么无论我们扩展它多少,它都无效,所以我们需要通过增加startIdx来减少它

伪代码:

multiset<int> nums;

int startIdx = 0, endIdx = 0;
int sol = 0;

while(endIdx != inp.size()) {
    if (endIdx - startIdx < 3) {
       nums.add(inp[endIdx]);  
       endIdx++;
    } else  {
       if (nums.lowestElement() + nums.secondLowestElement() < nums.highestElement()) {
          nums.remove(nums.find(inp[startIdx]));
          startIdx++;
       } else { 
            sol += endIdx - startIdx - 2; // amount of valid subarrays ending in inp[endIdx - 1]
            nums.add(inp[endIdx]);  
            endIdx++;
       }
    }
}
multiset nums;
int startIdx=0,endIdx=0;
int-sol=0;
while(endIdx!=inp.size()){
如果(endIdx-startIdx<3){
添加(inp[endIdx]);
endIdx++;
}否则{
如果(nums.lowestElement()+nums.second lowestElement()
如果有问题的链接或屏幕截图,问题会更清楚。你能告诉我问题中有什么不清楚吗?我将添加它以澄清问题?我已经添加了示例TC,现在清楚了吗?但这就是我所做的,它仍然给出相同的结果。考虑所有元素都是1,所以至少3个元素的每个子数组都是有效的。然后有10^5个元素,有1+2+3+4…+n-2个溶液,顺序为10^10。您的代码将计算其中的每一个(cnt++),从而得到TLE。我的将计算其中的一部分,我的sol+=部分仅运行10^5次
multiset<int> nums;

int startIdx = 0, endIdx = 0;
int sol = 0;

while(endIdx != inp.size()) {
    if (endIdx - startIdx < 3) {
       nums.add(inp[endIdx]);  
       endIdx++;
    } else  {
       if (nums.lowestElement() + nums.secondLowestElement() < nums.highestElement()) {
          nums.remove(nums.find(inp[startIdx]));
          startIdx++;
       } else { 
            sol += endIdx - startIdx - 2; // amount of valid subarrays ending in inp[endIdx - 1]
            nums.add(inp[endIdx]);  
            endIdx++;
       }
    }
}