Dart新手求助:如何查找数组中的最小值与第二小值?
在Dart中查找数组的最小值与第二小值
作为Dart新手,这里给你两种实用的实现方式,分别兼顾效率和易理解性:
方法一:单次遍历法(高效推荐)
这种方法只需要遍历数组一次,时间复杂度为O(n),适合处理大数组。核心思路是用两个变量分别记录最小值和第二小值,遍历过程中动态更新它们:
void findMinAndSecondMin(List<int> arr) { // 先处理数组长度不足的情况 if (arr.length < 2) { print('数组至少需要包含2个元素'); return; } // 初始化最小值和第二小值为整数最大值 int min1 = int.maxFinite; int min2 = int.maxFinite; for (int num in arr) { if (num < min1) { // 当前数比最小值更小,把原最小值移给第二小值,更新最小值 min2 = min1; min1 = num; } else if (num < min2 && num != min1) { // 当前数比第二小值小,但不等于最小值时更新第二小值 // 如果允许第二小值和最小值重复(比如数组[1,1,2]的第二小是1),可以去掉`num != min1`的判断 min2 = num; } } // 处理所有元素都相同的情况 if (min2 == int.maxFinite) { print('所有元素相同,最小值和第二小值都是:$min1'); } else { print('最小值:$min1,第二小值:$min2'); } } // 测试示例 void main() { findMinAndSecondMin([5, 3, 8, 1, 2, 1]); // 输出:最小值:1,第二小值:2 findMinAndSecondMin([2, 2, 2]); // 输出:所有元素相同,最小值和第二小值都是:2 findMinAndSecondMin([10, 1]); // 输出:最小值:1,第二小值:10 }
方法二:排序法(简单易上手)
如果你更在意代码的简洁性和易理解性,可以先给数组排序,再取前两个符合要求的元素。这种方法时间复杂度为O(n log n),适合小范围数组:
void findMinAndSecondMinWithSort(List<int> arr) { if (arr.length < 2) { print('数组至少需要包含2个元素'); return; } // 创建数组副本避免修改原数组,然后排序 List<int> sortedArr = List.from(arr)..sort(); int min1 = sortedArr[0]; int min2 = min1; // 找到第一个不等于最小值的元素 for (int i = 1; i < sortedArr.length; i++) { if (sortedArr[i] != min1) { min2 = sortedArr[i]; break; } } print('最小值:$min1,第二小值:$min2'); } // 测试示例 void main() { findMinAndSecondMinWithSort([5, 3, 8, 1, 2, 1]); // 输出:最小值:1,第二小值:2 findMinAndSecondMinWithSort([2, 2, 2]); // 输出:最小值:2,第二小值:2 findMinAndSecondMinWithSort([10, 1]); // 输出:最小值:1,第二小值:10 }
注意事项
- 必须先判断数组长度是否小于2,否则会出现索引越界或逻辑错误
- 如果业务允许第二小值和最小值重复(比如数组全是同一个数),记得调整判断条件
内容的提问来源于stack exchange,提问作者Mohmed Ashraf
相关产品推荐
相关产品推荐

