Algorithm 求给定数组所有子区间的最大可能差之和
我在设计算法时遇到了一个问题。问题是这应该在O(n)时间内执行 以下是作业: 存在一个包含n个数字的未排序数组“a”Algorithm 求给定数组所有子区间的最大可能差之和,algorithm,Algorithm,我在设计算法时遇到了一个问题。问题是这应该在O(n)时间内执行 以下是作业: 存在一个包含n个数字的未排序数组“a” mij=min{ai, ai+1, ..., aj}, Mij=max{ai, ai+1, ..., aj} 计算: S=SUM[i=1,n] { SUM[j=i,n] { (Mij - mij) } } 我能够在O(nlogn)时间内解决这个问题。这是一项大学研究任务。我所做的一切都表明这是不可能的。如果你能给我指出解决问题的正确方向,我将不胜感激。或者至少证明这是不可能的
mij=min{ai, ai+1, ..., aj}, Mij=max{ai, ai+1, ..., aj}
计算:
S=SUM[i=1,n] { SUM[j=i,n] { (Mij - mij) } }
我能够在O(nlogn)时间内解决这个问题。这是一项大学研究任务。我所做的一切都表明这是不可能的。如果你能给我指出解决问题的正确方向,我将不胜感激。或者至少证明这是不可能的
进一步解释: 给定
i
和j
,求数组切片a[i:j]的最大和最小元素。减去这些值得到切片的范围,a[max]-a[min]
现在,将所有(i,j)的所有切片的范围相加,这样
1这是一个非常直接的问题。
我将假设它是对象数组(如值对或元组),而不是数字。第一个值是数组中的索引,第二个值是值
正确的问题是,我们需要多少时间将每个数字相乘,然后从和中加/减,即在多少子序列中,它是最大和最小元素。
这个问题与寻找下一个最大元素(nge)有关,你们可以看到,只是为了知道它对未来的问题
我将用伪代码编写它
subsum (A):
returnSum = 0
//i am pushing object into the stack. Firt value is index in array, secong is value
lastStackObject.push(-1, Integer.MAX_INT)
for (int i=1; i<n; i++)
next = stack.pop()
stack.push(next)
while (next.value < A[i].value)
last = stack.pop()
beforeLast = stack.peek()
retrunSum = returnSum + last.value*(i-last.index)*(last.index-beforeLast.index)
stack.push(A[i])
while stack is not empty:
last = stack.pop()
beforeLast = stack.peek()
retrunSum = returnSum + last.value*(A.length-last.index)*(last.index-beforeLast.index)
return returnSum
sum(A)
//first we calculate sum of maximum values in subarray, and then sum of minimum values. This is done by simply multiply each value in array by -1
retrun subsum(A)+subsum(-1 for x in A.value)
subsum(A):
returnSum=0
//我正在把物体推入堆栈。第一个值是数组中的索引,第二个值是值
lastStackObject.push(-1,整数.MAX\u INT)
对于(inti=1;iQuestion不清楚。请提供正确的输入和所需的输出。S=SUM[1..n]SUM[i..n](Mij-Mij)是什么?@SomeDude:这是一个双总和,大写sigma。