查找数组中的连续最大差异

时间:2013-07-18 20:37:13

标签: ios

我创建了一个应用程序,在该应用程序中,用户不断地围绕z轴(偏航)旋转手机,手机屏幕朝上。每次旋转改变方向时,我想生成两个极端之间的角度。

想象一下以下值的数组:[ - 5,-3,-2,0,1,2,6,5,3,2,-1,-3,-4,-7,-4, -3,...]。我想要做的是找到数组的相对最大值和最小值,以便找出从一个相对最小值到下一个相对最大值的差异。在给定的数组中,-5将是第一个相对最小值,然后6将是下一个相对最大值。这里的差异将是11个单位。从相对最大值6开始,下一个相对最小值为-7。这里的差异将是13个单位。该过程将持续到阵列结束。我希望将这些差值输入到它们自己的数组中,即[11,13,...]。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

我解决这个问题的方法是首先编写一个检测最大值和最小值索引的算法,然后找出它的差异。

要获得最大值和分钟数,我建议迭代数组并查看当前值与上一个值和下一个值之间的差值。您需要查看差异符号的变化: 当差异从负变为正时,将发生最小,当差异从正变为负时,将发生最大

例如,查看数组的这一部分:[1,2,6,5,3]。从1到2的差异是正的,从2到6是正的,但从6到5是负的。差异的符号在6处从正变为负,所以我们知道它是最大值。

请注意,您还需要将第一个和最后一个元素包含为可能的最大值或分钟数。

获得最大值和最小值的索引后,您应该可以非常轻松地获得它们的差异。

答案 1 :(得分:0)

从最基本的意义上讲,您可以遍历数组,检查下一个值是否大于或小于之前的值。无论何时达到变化(正在增加,现在减少,反之亦然),您都会找到相对最大值/分钟(分别)。一个for循环迭代,一个布尔标志来检查(无论你是增加还是减少),以及对要检查/存储的数组中当前和先前索引的明显了解。

我不太愿意为此提供准确的代码,因为它非常基本,看起来非常像家庭作业问题......

答案 2 :(得分:0)

我看到这个数组中第一个值的方式总是你的初始相对最小值和最大值,因为你完全没有从一开始就比较的基础(除非你将relMin和relMax都归为0或定义一个范围到找到你的relMin和relMax)。考虑到这一点,假设您使用-5& 6作为第一对比。

让我们使用你的数组并使用For循环遍历数组...

[-5,-3,-2, 0, 1, 2, 6, 5, 3, 2,-1,-3,-4,-7,-4,-3,...]
  

0:relMin = -5,relMax = -5,delta = 0

     

1:relMin = -5,relMax = -3,delta = 2

     

2:relMin = -5,relMax = -2,delta = 3

     

3:relMin = -5,relMax = 0,delta = 5

     

4:relMin = -5,relMax = 1,delta = 6

     

5:relMin = -5,relMax = 2,delta = 2

     

6:relMin = -5,relMax = 6,delta = 11

     

7:

     

...

     

13:relMin = -7,relMax = 6,delta = 13

     

...

基本上你正在做的是在你当前的delta不等于你之前的delta时写入你的输出数组。由于relMin和relMax之间的更改是互斥的(在遍历数组时只能更改其中一个值)所有必须检查的是不等式...

//prime your values
//if it make sense for your purposes prime them both with 0
//this also assumes you have at least 1 value in valueArray
relMin = valueArray[0];
relMax = valueArray[0];

//the following line will always be true if you use valueArray[0] as your relMin and relMax baseline
deltaArray[0] = 0;
for (i = 0; i < [valueArray count]; i++)
{
 if (valueArray[i] < relMin)
 {
  relMin = valueArray[i];
 }
 if (valueArray[i] > relMax)
 {
  relMax = valueArray[i];
 }
 deltaPrevious = deltaArray[[deltaArray count] - 1];
 deltaCurrent = relMax - relMin;
 if (deltaCurrent != deltaPrevious)
 {
  deltaArray[deltaArray count] = deltaCurrent;
 }
}