给出的是像23 7 13 4 8 6这样的整数序列。我想使用以下规则检测局部最小值和最大值:
我可以使用方法hasNextInt和getNextInt。
目前,我正在考虑该算法。但是我不确定我是否理解逻辑。首先,我建立一个tuple并比较其数字。例如。我将23和7进行比较。7是本地最小值。那我该怎么办?建立一个triple?但是那个三倍数是23 7 13或13 4 8?我不确定。
有什么想法吗?
更新:
假设我们将左邻居和该数字存储在三个数字的中间:
left middle current
0 0 23
23 0 7
23 7 13 <- you have a triple, compare => minimum 7
然后会发生什么?将var设为0,然后从下一个数字4开始?还是在左边存储7,在中间存储13以使当前为4?
更新(此代码似乎起作用):
int left = 0;
int center = 0;
while(hasNextInt()){
int current = getNextInt();
if((left != 0) && (center != 0)){
if(current > center && center < left){
System.out.println("Min: "+center);
left = center; center = current;
}else{
left = center; center = current;
}
}else if((left != 0) && (center == 0)){
if(left < current){
System.out.println("Min: "+left);
center = current;
}else{
center = current;
}
}else if((left == 0) && (center == 0)){
left = current;
}
}
if(left > center){
System.out.println("Min: "+center);
}
感谢您的帮助!
您在那里拥有的东西似乎是一个不错的开始。
但是,仅查看元组是不够的,因为您必须查看三个数字才能检测出局部最小值-因此必须扩展算法。
要了解如何执行此操作,请尝试在纸上编写一个简单示例。您将如何手动查找局部最小值?您可以在程序中做类似的事情吗?
随时发布您程序的更新版本(通过编辑问题,在底部添加新代码,然后如果您仍然遇到问题,我们可以提供帮助。
进行您的编辑:
然后会发生什么?设置变量到0并从下一个数字4开始?或者在左侧存储7,在中间存储13当前有4个?
您不能将所有内容都设置为0;您仍然需要三元组的最后两个数字才能开始下一个三元组,因为三元组的行为就像一个在数字列表上滑动的窗口(这通常被称为“滑动窗口”技术,因为许多算法都在使用它)。
您可以手动将数字复制到其新变量。
为了获得更多的优雅,您可以在单独的“ Triplet”类中实现此功能。要考虑的想法:该课程可以检查最小值,然后让您添加一个新数字,自动“推出”最旧的数字。
这里是一个建议:
private void findMin() {
int count = 0; // To handle special case of singleton list
int left = Integer.MAX_VALUE;
int mid = Integer.MAX_VALUE;
int right = Integer.MAX_VALUE;
while (hasNextInt()) {
count++;
left = mid;
mid = right;
right = getNextInt();
if (right > mid && mid < left)
System.out.println("local min: " + mid);
}
if (count > 1 && right < mid)
System.out.println("local min: " + right);
}
跟踪您以前是否使用两个布尔值增加或减少。当您读取数组中的下一个数字时,请再次检查并比较4个布尔值:
local_minimum = previously_decreased && just_increased;
local_maximum = previously_increased && just_decreased;
然后先存储->先前,然后继续。
开始时,两个previous_布尔值都应设置为true。最后,您将需要另一遍循环,将just_ booleans都设置为true。
显然,这些增加/减少布尔值是严格的,因此相等的值会将两个布尔值都设为false。
希望有所帮助。
按照定义,在序列中间的某处想到一个三元组:
... A, B, C, ...
显然是B局部最小值(如果且仅当:A-B > 0 && B-C <0
否则,B局部最大值:A-B < 0 && B-C >0
没什么特别的
如果实现此逻辑,并遍历列表,特别是在末端处理案例,您应该能够在O(n)中找到所有局部最优值。