问题陈述:- 我遇到的问题是在编码竞赛中,queryIndex是在array中给出的。给定一个数组。我们必须使用queryIndexArray获取每个索引并在主数组中执行以下操作:-
for k = queryIndex[i] + 1 to array.length
if (array[k] < array[queryIndex[i]]){
array[queryIndex[i]] = 0
}
我已经编写了JavaScript代码,但问题是运行10.03秒需要10秒,准确地说,由于问题是基于时间的,我如何将运行时降低到2秒
我使用的方法:-
let arrayLength = 5 ;
let array = [4,3,4,2,1]
let queryIndex = [3,2]
let queryIndexLength = 2
for (let i =0 ; i <queryIndexLength ; i ++ ){
let forwardIndex = queryIndex[i] + 1
for (let j = forwardIndex ; j< arrayLength ; j++){
if (array[forwardIndex] < array[j] ){
array[j] = 0
}
}
}
此代码通过了测试用例,但问题是执行需要10秒,而该问题的运行时间仅为2秒。我是否应该使用其他数据结构(如集合)?由于阵列需要更长的时间,因此请提出解决方案?
代码简要说明:-
这只是一个示例代码,原始测试用例的值对于array和queryIndex来说足够大,因此花费了10.03秒
问题所在:-时间复杂度大的输入要花10秒,我想在2秒以内得到它,因此如何实现它作为o(n)^ 2解决方案。
答案 0 :(得分:2)
您可以使用以下算法在O(array.length + queryIndex.length*log(queryIndex.length))
中进行此操作:
sort(queryIndex)
minQuery = Infinity
foreach i in queryIndex:
minQuery = minimum(array[queryIndex[i]], minQuery)
foreach j of (queryIndex[i] .. queryIndex[i+1]):
if array[j] > minQuery
array[j] = 0
无需多次遍历大数组的某些部分(从每个queryIndex到数组的末尾),只需将每个元素与queryIndex上的值进行比较:条件和操作每次看起来都相同。您只需要找到与多个运行中已匹配的所有元素匹配的条件即可。