算法:寻找数组的第二大的元素(不排序、只循环一次)

该算法的原理是,在遍历数组的时,始终记录当前最大的元素和第二大的元素。示例代码:

package demo01

import (
	"fmt"
)

func NumberTestBase() {
	fmt.Println("This is NumberTestBase")

	nums := []int{12, 24, 2, 5, 13, 8, 7}
	fmt.Println("nums:", nums)
	secondMax := getSecondMaxNum(nums)
	fmt.Println("secondMax=", secondMax)
}

func getSecondMaxNum(nums []int) int {
	length := len(nums)
	if length == 0 {
		panic("Slice nums cannot be 0-size.")
	}

	if length == 1 {
		return nums[0]
	}

	var max, secondMax int
	if nums[0] > nums[1] {
		max = nums[0]
		secondMax = nums[1]
	} else {
		max = nums[1]
		secondMax = nums[0]
	}

	for i := 2; i < len(nums); i++ {
		if nums[i] > secondMax {
			if nums[i] <= max {
				secondMax = nums[i]
			} else {
				secondMax, max = max, nums[i]
			}
		}
	}
	return secondMax
}
时间: 2024-10-09 07:24:34

算法:寻找数组的第二大的元素(不排序、只循环一次)的相关文章

查找序列中第二大的元素

这个问题,感觉很简单,一看就可能首先想到几种方法,例如: 首先对这个序列进行排序,然后取第二个位置的元素:或者循环遍历元素序列,找到最大的元素,然后将其移除.再重复此过程,得到第二大的元素. 但是都没有考虑其效率.下面提出一种方法: <span style="font-size:14px;">package algrithm; public class secondbignum { public static void main(String[] args) { int [

输出数组第k大的元素

用快速排序的思想输出数组第k大的元素: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 //递归实现:返回数组第k大的值.数组下标区间是[begin,end].其中数组假定n个元素,则k的值在区间[1,n]. 6 //能够使用这种方法的前提条件是:n个数不能重复.如果n个数中有重复,那么区间的大小不能保证就是第K大. 7 int findkth(int* arr, int begin, in

获得第二大的元素

#include<iostream> using namespace std; int main() { int s1 = 1; unsigned int s2 = 1; cout<<(s1<<31)<<endl; ///这是把i左移两位,左移的规则只记住一点:丢弃符号位,0补最低位!如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. cout<<(s2<<31)&

找出一个整形数组中第二大的数字

如何在时间复杂度为O(n)内找出数组中第二大的数字? 通过设置两个变量,一个保存最大值,一个保存第二大值,通过在找最大值的过程中,原来的最大值逐渐变为第二大值.一种实现代码如下(Java版): 1 /** 2 * 在时间复杂度为O(n)内找出数组的第二大的数字 3 * @author JiaJoa 4 * 5 */ 6 public class Algorithm_GetSecondMax { 7 8 public static void main(String[] args) { 9 // T

经典算法题每日演练——第二十四题 梳排序

原文:经典算法题每日演练--第二十四题 梳排序 这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化. 冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小, 效率反而必gap=1要高效的多. 下面我们看看具体思想,梳排序有这样一个1.

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

同时寻找最大值和第二大值 锦标赛算法

问题:在一个数组中同时寻找最大值和第二大值,这里假设数组的元素个数n大于2 方法一:遍历数组,设置max和secondMax标志,如果有大于max的就更新max,如果有小于max但是大于secondMax的就更新secondMax. 比较次数:在a[0]和a[1]中找出临时的max和secondMax需要一次比较.在剩下的n-2个数中最坏时需要同max和secondMax分别比较,总共比较2(n-2),所以总的比较次数为1+2(n-2).代码如下: void traverse_find(int

如何找出数组中第二大的数

1.最容易想到的办法 我们可以用最简单的办法来找到一个数组中任意大小的数字,那就是按照某一个排序方式将数组的所有元素进行排序,然后按需取出来就可以,知识这种方式的时间复杂度和空间复杂度比较大,所以,有了下面这种方式 2.通过设置两个变量来进行判断 这种方式可以只通过一遍扫描数组即可找到第二大数,具体的形式如下:先定义两个变量:一个变量用来存储数组的最大数,初始值为数组首元素,另一个变量用来存储第二大的数,初始值为最小负整数,然后遍历数组元素,如果数组元素的值比最大数变量还大,更新最大数:若数组元

求出整形数组中第二大的数的值

1 int findsecond(int a[], int size) 2 { 3 int max = a[0]; 4 int second = a[1]; 5 int index = 0; 6 for (int i = 0; i < size; ++i) 7 { 8 if (max < a[i]) 9 { 10 second = max; 11 index = i; 12 max = a[i]; 13 } 14 else if (max > a[i]) 15 { 16 if (seco