查詢演算法——找到序列中第二大的數
阿新 • • 發佈:2019-01-24
今天來說一個簡單的需求:在一個序列中找到第二大的元素。
一眼看到這個問題,感覺解決的方法有很多,因為這並不是一個困難的問題。隨便一想,能有下面幾種解法:
1 首先排序,然後取第二個位置的元素
2 迴圈遍歷元素序列,找到最大的元素,然後將其移除。再重複此過程,得到第二大的元素
當然還有其他的思路,這裡就不一一列舉了。如果大家有什麼好的想法,可以給我留言,咱們一起探討。
仔細分析一下,不難發現,上面的方法雖然可以達到目的,但是效率都不高。第一種方法相當於一次排序過程,最快也要O(nlogn)的時間才能完成。而第二種方法需要迴圈遍歷序列兩次,O(n)+O(n)的時間複雜度雖然不是無法接受,但畢竟還是要迴圈兩次。對於我們寫軟體的人來說,顯然希望程式碼是“完美”的。因此在這裡,提出一個只迴圈一次的方法,供大家借鑑參考。如果大家有好方法,歡迎提出。
廢話不說,下面介紹演算法思路:
我們既然可以迴圈遍歷一次得到最大的元素,為什麼不能儲存住第二大的元素呢?當然可以,我們在比較元素大小時,只要把小的儲存起來,經過一遍迴圈,這個元素就是第二大的元素了。
程式碼就更簡單了
int find_second_biggest(vector<int> &v){ int len = v.size(); int max,second; if (len < 2){ return -1; } if (v[0]>v[1]){ second = v[1]; max = v[0]; } else{ second = v[0]; max = v[1]; } for (int i=2; i< len; i++){ if(max < v[i]){ second = max; max = v[i]; } elseif (second < v[i]){ second = v[i]; } } return second; }