同時找到最大值和最小值——程式設計之美
同時找到最大值和最小值——程式設計之美
給定一個陣列,我們可以同時找到其中的最大數和最小數嗎?要求時間複雜度儘可能的小。
程式設計之美上面提供了三個思路,我把它們都實現了,並做一些講解補充。
思路一:
兩次遍歷,分別得到最大值和最小值。時間複雜度為O(2*N)。
思路二:
把最前面的兩個數作為最值的候選,然後後面的數兩兩一組,分別讓其中的較大值和候選最值比較,讓其中的較小值和候選最值比較。
感覺這種方法和推排序有點兒類似。。
思路三:
採用分治法思想,把整個陣列一分為二,讓左邊的最值和右邊的最值分別比較,這裡有個遞迴的過程,主要跳出遞迴的條件是當陣列的begin和end相差小於等於1的時候,跳出。
上面三個思路的程式碼如下:
#include<iostream>
using namespace std;
struct Pair
{
int max, min;
};
// 遍歷兩次,時間複雜度為O(2*N)
Pair minMax_1(int a[], int n)
{
int max = a[0], min = a[0];
for(int i = 0; i < n; i++)
{
min = a[i] < min ? a[i]:min;
max = a[i] > max ? a[i]:max;
}
Pair p;
p.max = max;
p.min = min;
return p;
}
// 兩兩比較,時間複雜度是O(1.5*N)
Pair minMax_2(int a[], int n)
{
int max = a[0], min = a[1];
if(max < min)
swap(max, min);
for(int i = 2; i < n; i = i + 2) // 遞進2個
{
int tmpMin = a[i];
int tmpMax = a[i+1];
if(tmpMax < tmpMin)
swap(tmpMin, tmpMax); // 候選
max = max > tmpMax ? max:tmpMax;
min = min < tmpMin ? min:tmpMin;
}
// 防止長度為奇數
max = max > a[n-1] ? max:a[n-1];
min = min < a[n-1] ? min:a[n-1];
Pair p;
p.max = max;
p.min = min;
return p;
}
// 分治法,時間複雜度也是O(1.5*N)
Pair minMax_3(int a[], int begin, int end)
{
Pair P;
if(end - begin <= 1)
{
P.max = a[begin] > a[end] ? a[begin]:a[end];
P.min = a[begin] < a[end] ? a[begin]:a[end];
return P;
}
Pair PL = minMax_3(a, begin, begin + (end - begin) / 2);
Pair PR = minMax_3(a, begin + (end - begin) / 2 + 1, end);
P.max = PL.max > PR.max ? PL.max:PR.max;
P.min = PL.min < PR.min ? PL.min:PR.min;
return P;
}
int main()
{
Pair P;
int a[] = {3, 6, 1, 8, 0};
int n = 5;
// solution 1
P = minMax_1(a, n);
cout<<P.min<<' '<<P.max<<endl;
//solution 2
P = minMax_2(a, n);
cout<<P.min<<' '<<P.max<<endl;
//solution 3
P = minMax_3(a, 0, n-1);
cout<<P.min<<' '<<P.max<<endl;
return 0;
}
相關文章
- JavaScript 陣列最大值和最小值JavaScript陣列
- JavaScript 陣列 最大值和最小值JavaScript陣列
- JavaScript陣列最大值和最小值JavaScript陣列
- float型別最大值和最小值型別
- JavaScript可以設定最大值和最小值的隨機數JavaScript隨機
- MapReduce程式設計基礎(二)——數值概要(計算最大值、最小值、平均值)程式設計
- JavaScript 專題之如何求陣列的最大值和最小值JavaScript陣列
- JavaScript獲取陣列最大值和最小值JavaScript陣列
- JavaScript陣列中的最大值和最小值JavaScript陣列
- 數字之魅:尋找陣列中的最大值和最小值陣列
- 程式設計之美之買票找零程式設計
- js獲取陣列的最大值和最小值程式碼例項JS陣列
- 程式設計之美複習筆記程式設計筆記
- 程式設計之美之高效安排見面會程式設計
- 程式設計之美之最短摘要生成程式設計
- 7-1 最大值和最小值 (10分)__C++C++
- C/C++_int/float/double的最大值和最小值C++
- Go併發程式設計之美-CAS操作Go程式設計
- Go併發程式設計之美-互斥鎖Go程式設計
- js獲取陣列元素中的最大值和最小值JS陣列
- js獲取數字陣列中的最大值和最小值程式碼例項JS陣列
- 程式設計之美leetcode之編輯距離程式設計LeetCode
- 程式設計之美初賽第一場--焦距程式設計
- 程式設計之美初賽第一場--樹程式設計
- 演算法字串位包含程式設計之美演算法字串程式設計
- 尋找陣列中的最大值和最小值O(1.5*N)陣列
- [程式設計之美][2.2] 不要被階乘嚇倒程式設計
- 程式設計師必看:程式的美,不止動畫的美程式設計師動畫
- JavaScript陣列最大值、最小值和平均數JavaScript陣列
- int float double 各型別的最大值最小值型別
- 品味Spring Cache設計之美Spring
- 重新領略設計模式之美設計模式
- 求陣列之和,最小值,最大值,平均值陣列
- 程式碼之美---遞迴之美遞迴
- 設計模式之美-王爭-極客時間-返現24元設計模式
- 程式設計之美之電話號碼對應英語單詞程式設計
- 程式碼同時提交到 github 和 giteeGithubGitee
- Java併發程式設計之美-千無萬喚使出來Java程式設計