414. Third Maximum Number

本文介绍两种高效算法来寻找数组中的第三大数值:一种使用三个变量跟踪最大值,另一种利用集合数据结构。文章详细解释了每种方法的时间复杂度及实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

 

Example 2:

Input: [1, 2]

 

Output: 2

 

Explanation: The third maximum does not exist, so the maximum (2) is returned instead.

 

Example 3:

Input: [2, 2, 3, 1]

 

Output: 1

 

Explanation: Note that the third maximum here means the third maximum distinct number.

Both numbers with value 2 are both considered as second maximum.

 

 Solution 1: use three variants first,second,third to represent the  first,second,third maximum. Note that use long long type to solve the condition that INT_MIN exists in the array. (Line 4)

 

 1 class Solution {
 2 public:
 3     int thirdMax(vector<int>& nums) {
 4         long long first=LLONG_MIN, second=LLONG_MIN, third=LLONG_MIN; //
 5         for (int num:nums) {
 6             if (num>first) {
 7                 third=second;
 8                 second=first;
 9                 first=num;
10             }
11             else if (num<first && num>second){
12                 third=second;
13                 second=num;
14             }
15             else if (num<second && num>third){
16                 third=num;
17             }
18         }
19         return (third==LLONG_MIN)?first:third;
20     }
21 };

Solution 2: use the functions of set: ordering and including unique key. Set is implemented with red-black tree, the complexity of operation of insert  is O(log3) and erase is O(1), so the total complexity is O(n). 

 1 class Solution {
 2 public:
 3     int thirdMax(vector<int>& nums) {
 4         set<int> s;
 5         for (int num:nums){
 6             s.insert(num);
 7             if (s.size()>3){
 8                 s.erase(s.begin());
 9             }
10         }
11         return (s.size()<3)?*(s.rbegin()):*s.begin();
12     }
13 };

 

转载于:https://www.cnblogs.com/anghostcici/p/6668655.html

Yousef has an array a of size n . He wants to partition the array into one or more contiguous segments such that each element ai belongs to exactly one segment. A partition is called cool if, for every segment bj , all elements in bj also appear in bj+1 (if it exists). That is, every element in a segment must also be present in the segment following it. For example, if a=[1,2,2,3,1,5] , a cool partition Yousef can make is b1=[1,2] , b2=[2,3,1,5] . This is a cool partition because every element in b1 (which are 1 and 2 ) also appears in b2 . In contrast, b1=[1,2,2] , b2=[3,1,5] is not a cool partition, since 2 appears in b1 but not in b2 . Note that after partitioning the array, you do not change the order of the segments. Also, note that if an element appears several times in some segment bj , it only needs to appear at least once in bj+1 . Your task is to help Yousef by finding the maximum number of segments that make a cool partition. Input The first line of the input contains integer t (1≤t≤104 ) — the number of test cases. The first line of each test case contains an integer n (1≤n≤2⋅105 ) — the size of the array. The second line of each test case contains n integers a1,a2,…,an (1≤ai≤n ) — the elements of the array. It is guaranteed that the sum of n over all test cases doesn't exceed 2⋅105 . Output For each test case, print one integer — the maximum number of segments that make a cool partition. Example InputCopy 8 6 1 2 2 3 1 5 8 1 2 1 3 2 1 3 2 5 5 4 3 2 1 10 5 8 7 5 8 5 7 8 10 9 3 1 2 2 9 3 3 1 4 3 2 4 1 2 6 4 5 4 5 6 4 8 1 2 1 2 1 2 1 2 OutputCopy 2 3 1 3 1 3 3 4 Note The first test case is explained in the statement. We can partition it into b1=[1,2] , b2=[2,3,1,5] . It can be shown there is no other partition with more segments. In the second test case, we can partition the array into b1=[1,2] , b2=[1,3,2] , b3=[1,3,2] . The maximum number of segments is 3 . In the third test case, the only partition we can make is b1=[5,4,3,2,1]
最新发布
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值