Arrays 需要更有效的方式读取子阵列
问题陈述询问iArrays 需要更有效的方式读取子阵列,arrays,algorithm,loops,coding-efficiency,time-limiting,Arrays,Algorithm,Loops,Coding Efficiency,Time Limiting,问题陈述询问i
约束条件:
1一个简单的方法是如下所示。你的逻辑是正确的,这就是我实现的。我改变了排序(NlogN),只通过一次(N)查找2个最小和最大的数字。我还没有编译代码,也不确定它是否能正常工作。它的总体复杂度为(N*N*N) 通过执行一些额外的检查,可以缩短执行时间:
可以在每个内部(k)循环后检查条件,如果违反单个情况,则断开李>min1+min2>=max
- 如果子阵列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
=最大值) 计数++; } }
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++;
}
}
}