日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----找到给定数组中第三大的值

發布時間:2024/4/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道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-----找到给定数组中第三大的值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。