Algorithm 给定n个整数a1,a2,…,an和k。这些元素可以构成一个三角形的子数组长度k是多少?
给定一组不同的正整数,假设它可以“构造一个三角形”,如果它可以划分为三个子集,其和可以是三角形三条边的长度(即:三个子集,其和满足条件)。例如,{1,2,3,4}可以通过将其划分为{1,2},3,4}来“构造三角形”,因为三角形的边长可以是1+2,3和4(因为1+2+3>4,1+2+4>3,3+4>1+2) 我得到了一个数组A,其中最多有105个在[0109]范围内的不同非负整数和一个整数k,我需要找出有多少个长度为k的连续子数组可以构造三角形。例如,如果A=[1,3,4,2,5,9]和k=3,则有两个这样的子阵列:[3,4,2]和[4,2,5] 我尝试了以下方法:Algorithm 给定n个整数a1,a2,…,an和k。这些元素可以构成一个三角形的子数组长度k是多少?,algorithm,math,Algorithm,Math,给定一组不同的正整数,假设它可以“构造一个三角形”,如果它可以划分为三个子集,其和可以是三角形三条边的长度(即:三个子集,其和满足条件)。例如,{1,2,3,4}可以通过将其划分为{1,2},3,4}来“构造三角形”,因为三角形的边长可以是1+2,3和4(因为1+2+3>4,1+2+4>3,3+4>1+2) 我得到了一个数组A,其中最多有105个在[0109]范围内的不同非负整数和一个整数k,我需要找出有多少个长度为k的连续子数组可以构造三角形。例如,如果A=[1,3,4,2,5,9]和k=3,
- 迭代A,检查长度为k的每个连续子数组。
- 对于每个这样的子阵列,将其每个分区分为三个子集。
- 对于每个这样的划分,计算三个子集的和,并检查它们是否满足三角形不等式
- 对于每个这样的子阵列,将其每个分区分为三个子集。
- 返回至少一个分区通过检查的子阵列数
- 迭代A,检查长度为k的每个连续子数组。
- 对于每个这样的子阵列,确定其总和S和最大元素aG,然后检查S是否>2aG。
- 注#1:当且仅当情况如此时,子阵列可以构造三角形
- 注#2:通过使用前缀和,可以在O(n)时间内确定所有子阵列的和
- 注#3:所有子阵列的最大元素可通过使用deque在O(n)时间内确定
- 对于每个这样的子阵列,确定其总和S和最大元素aG,然后检查S是否>2aG。
- 返回至少一个分区通过检查的子阵列数
- 设i为子阵列的第一个索引,j为其最后一个索引(即j=i+k)−1)
- 假设我们已经对子阵列的元素进行了排序,因此Ai z,这相当于检查x+y+z>2z
- 但我们可以在不进行实际排序的情况下进行检查:x+y+z是整个子阵列的总和,z是其最大的元素
我不明白的是-这个解释表明,如果我们以一种特定的方式划分子阵列,那么这个划分满足三角形等式当且仅当x+y+z>2z。但是如果我们用不同的方式划分子阵列呢?即使这个划分不满足三角形不等式,难道不能有一个不同的划分满足吗?三角形不等式可以重述为(参见) 对于
x
、y
和z
的任何分区选择,我们有max(x,y,z)>=A_j
。因此,如果您已经描述了分区
x=Ai+Ai+2+…+Aj−二,
y=Ai+1+Ai+3+…+Aj−一,
z=Aj
如果不满足不等式(即x+y+z>2A_j
不成立),则任何其他分区也不会满足不等式
x+y+z > 2 max(x,y,z)