【LeetCode】数组-9(414)-O(n)内找到第三大的数

思路:

  从前向后遍历,用三个变量first second third 保存前三个大的数,初值设为long类型的无穷小(因为开始提交到案遇到负的临界值的情况),如果新来的数大于first则 second first依次后移并且把这歌新值赋值给first

【正确代码】

 1 class Solution {
 2     public int thirdMax(int[] nums) {
 3         long first = nums[0], second = Long.MIN_VALUE, third = Long.MIN_VALUE;
 4         if (nums.length == 1) {
 5             return (int)nums[0];
 6         }
 7         if (nums.length == 2) {
 8             return nums[0] > nums[1] ? (int)nums[0] : (int)nums[1];
 9         }
10         int count = 0;
11         for (int i = 1; i < nums.length; i++) {
12             if (nums[i] > first) {
13                 third = second;
14                 second = first;
15                 first = nums[i];
16             }else if (nums[i] > second && nums[i] < first) {
17                 third = second;
18                 second = nums[i];
19             }else if (nums[i] < second && nums[i] > third) {
20                 third = nums[i];
21             }else {
22                 continue;
23             }
24             count++;
25         }
26         if (count < 2) {
27             return (int)first;
28         }
29         return (int)third;
30     }
31 }

有时间想想用treeset的容器做一下。

时间: 2024-10-05 04:26:04

【LeetCode】数组-9(414)-O(n)内找到第三大的数的相关文章

在O(n)时间复杂度内找到出现超过一半的数

#include<iostream> using namespace std; bool solver(const int a[],const int n, int & num) { if(NULL == a || 0>= n) return false; ////注意,是小写~ int count = 0; int com = a[0]; for(int i = 1;i<n;i++) { if(0 == count) { com = a[i]; count++; } el

LeetCode 414. Third Maximum Number (第三大的数)

Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n). Example 1: Input: [3, 2, 1] Output: 1 Explanation: The third maximum is 1. Examp

hdu 1806 Frequent values(给定一个非降序数组,求任意区间内出现次数最多的数的次数)

1.题目解析可见<训练指南>P198 2代码: #include<cstdio> #include<cstring> #include<cmath> #define Min(a,b) ((a)<(b)?(a):(b)) #define Max(a,b) ((a)>(b)?(a):(b)) #define N 100005 #define INF 1<<30 using namespace std; int a[N]; int valu

Leetcode数组题*3

目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加一 题目描述 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123. 链接:ht

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

有两个排序数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,实现一个函数,把A2 插入到A1,并且是有序的

题目: 有两个排序的数组A1和A2,内存在A1的末尾有足够的空余空间容纳A2.请写一个函数,把A2的所有数字插入A1中,并且所有的数字是排序的. 首先想到的思路是从A1从头到尾复制数字,但是就会出现多次复制一个数字的情况.更好的办法是从尾到头比较A1和A2的数字,并把较大的数字,复制到A1中的合适位置. 1 class solution{ 2 public static void merge(int[] A1, int[] A2, int lengthA1, int lengthA2){ 3 i

【Leetcode Top-K问题 BFPRT】第三大的数(414)

题目 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2: 输入: [1, 2] 输出: 2 解释: 第三大的数不存在, 所以返回最大的数 2 . 示例 3: 输入: [2, 2, 3, 1] 输出: 1 解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数.存在两个值为2的数,它们都排第二. 解答 思路: 1,题目要求时间复杂度必须是O(n

【LeetCode】414. 第三大的数

给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2: 输入: [1, 2] 输出: 2 解释: 第三大的数不存在, 所以返回最大的数 2 . 示例 3: 输入: [2, 2, 3, 1] 输出: 1 解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数. 存在两个值为2的数,它们都排第二. 思路 先排序,再判断输出 int thirdMax(

【大杀器】利用划分树秒杀区间内第k大的数

最近看了一道题,大概就是给出一个序列,不断询问其子区间内第k大的数,下面是个截图 绕了一圈没找到中文版题目,if(你是大佬) then 去看截图:else{我来解释:给出一个整数n,和一个整数m,分别表示序列元素个数和询问次数,然后输入n个数和m个询问,每个询问包含3个数,分别是区间起止点(l和r)和k,求出区间内第k大的数并输出:}这是一道很简单的模板题,怎么解决呢?小编最初想到的是打暴力,正所谓暴力出奇迹,说不定可以成功,反正不会优化,先试试吧,直接把规定区间[l,r]排一次序了,然后在查找