每天一道LeetCode-----找到给定数组中第三大的值
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----找到给定数组中第三大的值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原題鏈接Third Maximum Number
要求找到給定數組中第三大的數。其中第一大的數,第二大的數,第三大的數互不相同,即嚴格的小于關系。并且規定時間復雜度是O(n)。另外如果找不到第三大的數,則返回數組中第一大的數
可以用三個變量first, second, third分別記錄第一大第二大以及第三大的數,初始化時是整數范圍的最小值,在隨后遍歷數組的過程中進行比較(假設遍歷到的數用n表示)
- 如果n大于first, 則將second賦值給third, first賦值給second,n賦值給first
- 如果n大于second小于first,則將second賦值給thid,n賦值給second
- 如果n大于third,則將n賦值給third
這樣實現有一些局限性,如果輸入的數組中包含整數的最小值(即first,second,third的初始值INT32_MIN),那么就無法區分到底是找到了第三大的數(它的值是INT32_MIN)還是沒有找到(因為third的值沒有改變)
解決方法時將初始值設置的再小一點,即INT64_MIN,但是如果輸入的數組包含的數據偏偏就是64位的就沒有辦法了
代碼實現如下
class Solution { public:int thirdMax(vector<int>& nums) {// 因為int的范圍小于long long int的范圍,所以這種方式可解// 但是如果輸入的是vector<long long int> 就沒有辦法了long long int first = INT64_MIN, second = INT64_MIN, third = INT64_MIN;for(auto& n : nums) {// 如果小于third或者和第一/二大的數相等,則不進行賦值 if(n <= third || n == second || n == first) {continue;}third = n;// 進行大小比較后交換數據if(third > second) swap(second, third);if(second > first) swap(first, second);}return third == INT64_MIN ? first : third;} };鑒于上述的局限性,需要換一種思路解決,但是對于時間復雜度的要求就無法滿足了。
考慮到題目中要求的時間復雜度是O(n),而二叉搜索樹插入刪除的時間復雜度是O(lgn),所以可以考慮用set實現,同時也可以受益于set的去重能力,總的時間復雜度是O(nlogn)
代碼實現如下
class Solution { public:int thirdMax(vector<int>& nums) {set<int> s;for(auto& n : nums) {s.emplace(n);if(s.size() > 3) {s.erase(s.begin());}}return s.size() == 3 ? *s.begin() : *s.rbegin();} };總結
以上是生活随笔為你收集整理的每天一道LeetCode-----找到给定数组中第三大的值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++代码片段(五)tuple的实现
- 下一篇: 每天一道LeetCode-----找到由