演算法設計:如何求陣列中第2大的數
一種思路是利用兩次冒泡法,因為第一次冒泡,最大的在a[n-1],第二次冒泡後,次最大值在a[n-2]這樣直接返回即可。核心程式碼如下:
for(int i=0; i<2; i++)
for(int j=0; j<n-i-1; j++)
{
if(a[j] >a[j+1])
swap(a[j], a[j+1]);
}
return a[n-2];
但是這樣做,顯然效率不夠高,幾乎要遍歷兩次,有沒有遍歷一次就可以找到呢?
第二種思路:
首先看原始碼:
int find2Max(int a[], int n)
{
int max1 = 0;
int max2 = 0;
for(int i=1; i<n; i++)
{
if(a[i] > a[max1])
{
max2 = max1;
max1 = i;
}
else if(a[i] > a[max2] && a[i] < a[max1])
max2 = i;
}
return max2;
}
首先設定兩個索引max1,max2,分別用來存最大的和次最大的索引。然後遍歷一次,當a[i] > a[max1]時是一種情況,要進行交換;另外當a[i] < a[max1] 同時a[i] > a[max2]時,這種情況也要進行處理。注意,max1、max2的索引初值均為0, 有的人把max2設成-1,這是不夠嚴密的。另外,就是遍歷的時候,從第二個數開始遍歷即可,即i = 1開始往後遍歷。
這個演算法的複雜度是o(n),問題似乎很好解決了,但試問有比這更快的方法嗎?而且,如果不是讓找第二大的數,而是找第三大、第四大、第五大,或者第三小、第4小的數,上面這種思路顯然是走不通的。腫麼辦? 下篇接著說。
相關推薦
演算法設計:如何求陣列中第2大的數
一種思路是利用兩次冒泡法,因為第一次冒泡,最大的在a[n-1],第二次冒泡後,次最大值在a[n-2]這樣直接返回即可。核心程式碼如下: for(int i=0; i<2; i++) for(int j=0; j<n-i-1; j++) { if(a[j] &g
C:numberNMax 陣列中第n大數的下標,方法比較笨,應用二級指標
//求陣列中第n大數的下標 int * numberNMax(int * array, int size, int n) { if (NULL==array) { printf("Pointer is NULL\n"); exit(EXIT_FAILURE);
線性時間複雜度求陣列中第K大數
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
快速排除(最優法,不是快排)求隨機陣列中第k大數(c++)(讓數隨機沒寫)
#include <iostream> using namespace std; int get_kth(int arr[], int n, int k) { int left = 0; int right = n - 1; while
求陣列中第K大的數
本題的的陣列是可以包含重複元素的,且要求時間複雜度控制在O(n) 解題思路:陣列中第k大的數等價於排序陣列中第n-k個數,直觀的想法是將陣列排序後取第n-k個數即可,但是最快的排序演算法時間複雜度也是O(nlogn), 可以參考快速排序一次劃分的思想,將時間複雜度降低為O(
線性時間複雜度求陣列中第K大的數
演算法思想基於快速排序,詳細步驟如下: 1. 隨機選擇一個分割點 2. 將比分割點大的數,放到陣列左邊;將比分割點小的數放到陣列右邊;將分割點放到中間(屬於左部分) 3. 設左部分的長度為L, 當K < L時,遞迴地在左部分找第K
各個排序演算法應用:求取陣列中第K大的數( LeetCode 215. Kth Largest Element in an Array )
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
C++ sort + vector 應用:求取陣列中第K大的數( LeetCode 215. Kth Largest Element in an Array )
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
前端演算法題:找出陣列中第k大的數字出現多少次
題目:給定一個一維陣列,如[1,2,4,4,3,5],找出陣列中第k大的數字出現多少次。 例如:第2大的數是4,出現2次,最後輸出 4,2 function getNum(arr, k){ // 陣列排序->從大到小 arr.sort((a, b)=>{
演算法題: 求一個整數陣列中,通過元素加減運算得到指定結果的所有運算過程. 例如【5,4,6,7,1】= 9 ?
題目: 給定一個整數陣列int[] a (a.length > 1),和一個整數值 m,試輸出所有運算結果等於m的運算過程。可使用的運算方式只有加法和減法。陣列元素最多參與一次運算。例如,給定陣列【5,4,6,7,1】和整數9,輸出運算結果為9的運算過程如下: +
分享《架構真經:網際網路技術架構的設計原則(原書第2版)》序言中的一段話
下面的一段話摘自《架構真經:網際網路技術架構的設計原則(原書第2版)》序言,很有感觸,拿出來分享一下: 馬爾科姆·格拉德威爾在《異類》一書中提出了著名的“一萬小時定律”,也就是說,任何凡人要成為某個領域的頂尖專家,都至少需要一萬個小時的練習。其實中國古訓也有“天道酬勤
尋找陣列中第k小的數:平均情況下時間複雜度為O(n)的快速選擇演算法
又叫線性選擇演算法,這是一種平均情況下時間複雜度為O(n)的快速選擇演算法,用到的是快速排序中的第一步,將第一個數作為中樞,使大於它的所有數放到它右邊,小於它的所有數放到它左邊。之後比較該中樞的最後位
演算法題:求N!末尾0的個數和求二進位制數中1的個數
1、給定一個整數,那麼N的階乘N!末尾有多少個0呢? 解題思路:N!=K*10^M,M的值即為N!末尾0的個數。又10^M=(2^M)*(5^M),因為一個數進行質因數分解後,2出現的概率比5大得多。所以只有計算出1到N包含多少個5的因子 public class demo2 {
【演算法設計與分析作業題】第十一週:20. Valid Parentheses
題目 C++ solution class Solution { public: bool isValid(string s) { stack<char> cstack; for (int i = 0; i < s.si
資料結構演算法題/求陣列中大小最接近的兩個元素的差
考慮下面這個演算法,它求的是數值陣列中大小最接近的兩個元素的差。 可對比看下求陣列中兩個元素差的最大值https://blog.csdn.net/fkyyly/article/details/83930343 演算法: MinDistance(A[0..n-1])
六中常用演算法設計:窮舉法、分治法、動態規劃、貪心法、回溯法和分支限界法
演算法設計之六種常用演算法設計方法 1.直接遍歷態(窮舉法) 程式執行狀態是可以遍歷的,遍歷演算法執行每一個狀態,最終會找到一個最優的可行解;適用於解決極小規模或者複雜度線性增長,而線
bfprt 演算法 (陣列中第K 小問題問題)
一:背景介紹 在一堆數中求其前 k 大或前 k 小的問題,簡稱 TOP-K 問題。而目前解決 TOP-K 問題最有效的演算法即是 BFPRT 演算法,又稱為中位數的中位數演算法,該演算法由 Blum、Floyd、Pratt、Rivest、Tarjan 提出,最壞
python:無序陣列中尋找第K大的元素
題目: 所謂“第(前)k大數問題”指的是在長度為n(n>=k)的亂序陣列中S找出從大到小順序的第(前)k個數的問題。 解法1:堆排序 採用元素下沉法,維護一個k大小的最小堆,對於陣列中的每一
給出一個分治演算法來找出n個元素序列中第2大的元素
題目:給出一個分治演算法來找出n個元素序列中的第2大的元素。 如果不是題目要求用分治法,用遍歷或排序都比這個分治法要快。下面說說解題思路吧 解題思路:當序列A[1..n]中元素的個數n=2時,通過直接比較即可找出序列的第2大元素。當n>2時,先求出序列A[1..n-
求取一組無序陣列中第k大的數
方法1.:維持一個大小為k最小堆, 後面來的數小或者等於堆頂元素,則跳過,; 後面來的數大於堆頂元素,堆頂元素彈出,新元素加入最小堆 最後留下的k個數就是,所有數中前k大的數,堆頂元素就是第k大的數 時間複雜度:由於維持大小為k的堆花費時間為log(k),所以時間