C ++程序 查找具有不同元素的数组中的第三个最大元素
给定一个n个整数的数组,找到第三个最大的元素。数组中的所有元素都是不同的整数。
示例:
输入: arr [] = {1,14,2,16,10,20}
输出: 第三个最大的元素是14
解释: 最大的元素是20,第二大的元素是16,第三大的元素是14
输入: arr[] = {19,-10,20,14,2,16,10}
输出: 第三个最大的元素是16
解释: 最大的元素是20,第二大的元素是19,第三大的元素是16
朴素方法: 首先找到最大元素,其次是第二大元素,然后排除它们两个找到第三个最大元素。基本思想是遍历数组两次,标记最大和第二大元素,然后排除它们两个找到第三个最大元素,即排除了最大和第二大元素的最大元素。
- 算法:
- 首先,遍历整个数组并找到最大值。
- 将其作为第一个最大值与其索引一起存储。
- 现在遍历整个数组,找到第二个最大值,不包括最大元素。
- 最后第三次遍历数组并找到第三个最大元素,即排除最大和第二大元素。
- 输出:
- 复杂度分析:
- 时间复杂度: O(n)。 数组被迭代三次,并且在常数时间内完成。
- 空间复杂度: 不需要额外的空间,因为索引可以存储在常量空间中。
有效方法: 该问题涉及在单个遍历中查找数组中的第三个最大元素。可以通过利用类似问题的帮助来解决该问题——查找第二个最大元素。所以想法是从开始到结束遍历数组并跟踪到该索引为止的三个最大元素(存储在变量中)。因此,在遍历整个数组之后,变量将存储数组的三个最大元素的索引(或值)。
- 算法:
- 创建三个变量 first 、 second 和 third ,用于存储数组的三个最大元素的索引。(最初它们都初始化为最小值)。
- 从开头到结束沿着输入数组移动。
- 对于每个索引,检查元素是否大于 first 。如果元素较大,则更新 first 的值。如果元素较大,请将 first 的值分配给 second ,将 second 的值分配给 third 。因此,最大的元素被更新,之前存储为最大的元素成为第二大,第二大的元素成为第三大。
- 否则,如果元素比 second 大,则可以更新 second 的值,第二大的元素成为第三大。
- 如果前两个条件失败,但元素大于 third ,则更新 third 。
- 遍历数组从开始到结束,打印 third 的值
- 输出:
- 复杂度分析:
- 时间复杂度: O(n)。 因为数组只遍历一次,所以时间是常数时间。
- 空间复杂度: O(1)。 不需要额外的空间,因为索引可以存储在常数空间中。