求数组中第三大的数字,如果不存在则返回最大的数字

要求:算法时间复杂度为O(n)。

代码:

public int getThirdMaxElement(int[] array) {
		if(array == null) {
			return 0;
		}
		if(array.length == 1) {
			return array[0];
		}
		if(array.length == 2) {
			return array[0] > array[1] ? array[0] : array[1];
		}

		int[] thirdArr = {0,0,0}; //数组存储最大的三个数
		int a = 0;  //thirdArr数组下标
		int b = 1;	//array数组下标

		thirdArr[0] = array[0];
		//填充thirdArr数组
		while(a < 2 && b < array.length) {
			if(thirdArr[a] != array[b]) {
				thirdArr[a+1] = array[b];
				a++;
			}
			b++;
		}
		if(a < 2) {
			//如果thirdArr只有两个元素
			return thirdArr[0] > thirdArr[1] ? thirdArr[0] : thirdArr[1];
		} else {
			//对thirdArr数组排序
			Arrays.sort(thirdArr); //升序
		}

		//对剩余数组进行比较
		while(b < array.length) {
			if(thirdArr[2] < array[b]) {
				//1.最大的数比较
				thirdArr[0] = thirdArr[1];
				thirdArr[1] = thirdArr[2];
				thirdArr[2] = array[b];
				b++;
				continue;
			}
			if(thirdArr[1] < array[b]) {
				//2.中间数比较
				thirdArr[0] = thirdArr[1];
				thirdArr[1] = array[b];
				b++;
				continue;
			}
			if(thirdArr[0] < array[b]) {
				//3.最小的数比较
				thirdArr[0] = array[b];
				b++;
				continue;
			}
			b++;
		}

		return thirdArr[0];
	}
时间: 2024-10-07 11:50:01

求数组中第三大的数字,如果不存在则返回最大的数字的相关文章

不用遍历 递归算法 求数组中数字的最大值

#include "stdio.h"int ax[] ={1000,5,6,8,9,800,5,200,3,6,5,8,9};int paixu (int n, int ret){    if (n==0) return ret>ax[0]?ret:ax[0];    int ret1= ret>ax[n]? ret:ax[n];    return paixu(n-1,ret1);}int main(int argc, char* argv[]){    int numb

求数组中任意两个数之间所有数字的和

303. Range Sum Query - Immutable   求数组中任意两个数之间所有数字的和 QuestionEditorial Solution My Submissions Total Accepted: 37248 Total Submissions: 146945 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j),

求数组中两两相加为某个数字的组合数

/** * 求数组中两两相加是20的组合数 * @param array * @param sum */ public static void getMethod_3(int[] array,int sum){ int count = 0; for(int i=0;i<array.length;i++){ if(i==array.length-1){ break; } for(int j=i+1;j<array.length;j++){ if(array[i]+array[j]==sum){

求数组中的最小值以及最小值的序列号

var Arr = [5,6,1,2,3];// var minValue = Math.min.apply(null,Arr);//apply方法可直接求出数组中的最小值var minIndex = $.inArray(minValue,Arr);//inArray求最小数在数组中的序列号 固定方法 alert(minIndex);//输出2 即数字1在数组中的位置 求数组中的最小值以及最小值的序列号

写一个方法求数组中的最大值,最小值,总和以及平均值。

class Program { /// <summary> /// 求数组中的最大值,最小值,总和以及平均值. /// </summary> /// <param name="nums">输入一个数组</param> /// <returns>返回一个新的数组(max,min,sum,avg)</returns> public static int[] GetMaxMinSumAvg(int[] nums) { i

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

用C随机产生的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。

用 C 求一组随机数的第二大值,不能通过对整体排序求得 1 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值.最小值.平均值以及各元素之和,及第二大值.        int a[20];    int sum = 0; //存储数组元素的和    //为数组赋值    printf("数组中的元素为:\n ");    for (int i = 0; i < 20; i ++) {        a[i] = arc4random() % 41 +

求数组中最长递增子序列的长度

个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 怒冲北京,为理想前行. 题目 解法 使用工具栈单枝遍历数组(思路源于工具栈可以双枝遍历二叉树的方法) 栈里存放的是数组的下

(算法)求数组中出现频率最高的数

不准备实现算法先,根据21题和前辈的经验,这道题的真正考核点不在于解决这个问题,而在于拿到这个问题以后题的问题. 正常的一个做法,一次扫描然后用HASHMAP进行一个统计,然后再扫描一次HASHMAP获得频率最高的数.时间是O(N)空间也是O(N). 还有一种是做排序,然后扫描一次根据下标计算可以得到频率最高的数(可以避免空间消耗?). (不知道是否还有别的做法?) 据说我们应该先问这个数组是否已经排序?(想得美) 然后是否已经知道这个数的大概出现频率(比如说超过一半) 是否可以用额外空间?是否