我有一个数组(简单数组):
int [] array = { 1, 2, 3, 4, 5 };
以及嵌套for循环来查找最小的元素。
public static int smallest(int[] array){
int answer = 0;
for(int i = 0; i < array.length; i++){
for(int j = 0 + i; j < array.length; j++){
if(array[i] < array[j]){
answer = i ;
}
}
}
return answer;
}
在本例中,我的嵌套for循环发现第一次遍历满足我的条件,其中[i]小于所有[j]元素。但是,我的循环继续运行,这就是我对逻辑/工作流感到困惑的地方。在提供的数组中找到所需结果后,如何安全退出?我的情况有问题吗?把事情复杂化了?因为设置answer=i很多次都是无缘无故的,这看起来很可笑。感谢您的意见。
4条答案
按热度按时间wz8daaqr1#
您只需要一个层就可以找到最小值,因为您只需要跟踪一个变量:
目前,您所拥有的是一个非常接近选择排序的实现:
关于“多次设置answer=i看起来很可笑”,你所发现的本质上是线性和线性之间的区别(
O(n)
)和二次的(O(n^2)
)复杂性。对于一些事情,比如排序,需要做更多的操作。有些事情,如寻找最小值,可以用较少的努力。qncylg1j2#
对于这个问题,一个循环就足够了。以下是一些帮助您解决问题的建议:
找到最小的元素意味着你已经通过比较直接或间接地证明了某些元素比其他元素小
直接意味着你只是比较a<b
间接的意思是表示a<b和b<c,所以a<c(及物性)
因此,如果将数组中的下一个元素与迄今为止找到的最小元素进行比较,直到遍历整个数组为止,那么就得到了最小的元素
6ioyuze23#
既然你不想得到一个完整的答案,这里有一些提示:
如果你想想这个测试,它是修改
answer
根据数组中两个项目的测试结果,array[i]
以及array[j]
. 如果两个元素都不是最小的呢?这项测试并不能证明这一点。你需要参与其中
answer
在测试中,这样你就可以跟踪“迄今为止最小的”,因为你循环数组。在列表中查找最小的数字不需要嵌套循环。如果你用手在纸上做的话,你就可以在一次通过中找出答案,每个数字只看一次。你的代码应该做同样的事情:一次循环,一次传递。
t3psigkw4#
如果您想坚持嵌套for循环,可以使用break;但实际上可以在一个for循环中完成:
math.min返回参数中两个值之间的最小值。
或者你可以做一个for循环,比较i和i+1的元素!