排序重叠
该程序的目的是遍历整数序列,并确定数组中每个序列的长度和顺序(升序或降序)。例如给定数组[53, 50, 41, 8, 64, 35, 17, 76, 58, 3, 75, 1, 99, 56, 2]
它应该能识别每个序列[53,50,41,8]
、[64,35,17]
、[76,58,3]
、[75,1]
、[99,56,2]
将它们排序为[8,41,50,53]
、[17,35,64]
、[3,58,76]
、[1,75]
和[2,56,99]
但我只能在对当前最大的数字排序后查找下一个最大的数字序列。
这是我的代码
public static void descendingStructure(int[] x, ArrayList<Integer> y) {
int descending = 1;
int maxDescending = 1;
int descendingRunStart = x.length - 1;
int descendingRunEnd = x.length - 1;
for (int i = 1; i < x.length; i++) {
{
if (x[i] < x[i - 1]) {
descending++;
} else if (x[i] > x[i - 1]) {
if (descending > 1) {
if (descending > maxDescending) {
maxDescending = descending;
descendingRunStart = i - descending;
descendingRunEnd = i - 1;
}
descending = 1;
}
}
}
}
if (descending > maxDescending) {
maxDescending = descending;
descendingRunStart = x.length - descending;
descendingRunEnd = x.length - 1;
}
if (maxDescending <= 1) {
return;
}
for (int i = descendingRunStart; i < descendingRunEnd; i++) {
y.add(i);
}
sortSubArray(x, descendingRunStart, descendingRunEnd);
System.out.println(Arrays.toString(x));
descendingStructure(x, y);
}
Here is my results after running my code
我以为会有一个数组[8, 41, 50, 53, 17, 35, 64, 3, 58, 76, 1, 75, 2, 56, 9]
但我得到了[8, 41, 50, 53, 17, 35, 64, 3, 58, 1, 75, 76, 2, 56, 99]
2条答案
按热度按时间cnwbcb6i1#
您可能希望将此问题视为操作finite state machine。
算法
状态由五个部分组成(假设我们正在检查
x1
,其中x0
是前一个元素,x2
是后一个元素:was_up
-x0 < x1
was_down
-x0 > x1
up
-x1 < x2
down
-x1 > x2
ldx
-最后子序列的索引在这个状态机中我们只需要区分两种情况。如果
was_up
和down
为真,或者was_down
和up
为真,则表示方向改变。对于这种情况,我们将对当前子序列进行排序,然后重置为初始状态,将ldx
更新为新子序列的开始。对于所有其他状态,
was_up
变为up
,was_down
变为down,我们继续下一个元素。下面的代码可以更精确地说明该算法。
示例代码
输出
ars1skjm2#
关于你的代码的一些评论:
y
被写入,但从未被读取,因此它是无用的else
部分后面不应该有条件。i+1
而不是i-1
,并检测递减序列的最后一个索引。我推荐这个算法:
1.在一个循环中收集所有递减序列,但不要反转任何内容。只要记录下所有的序列
1.将这些序列按长度排序
1.执行这些序列的反转。
在第一步中,您甚至可以收集序列,并使用它们的长度作为列表中的索引,并在该索引处的子列表中注册起始索引。这样就不再需要第二步;在这个列表的列表上循环将按照它们的大小顺序给予序列。
下面是一个实现:
该输出: