給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值;教材2-15
給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值;
解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值
可以用陣列第一個元素來初始化max,min
然後遍歷陣列,分別和max,min比較,一遍就可以找出
int a[n]; cin>>n int max,min; max=min=a[0] for(int i=1;i<n;i++) { if(a[i]>max) max=a[i]; else if (a[i]<min) min=a[i]; } cout<<max<<" "<<min<<endl;
這樣比較次數最壞就是數列遞減排列,需要比較2(n-1)次
最好的情況就是數列遞增排列,需要比較n-1次
平均次數為(3n-3)/2
所以為所求
相關推薦
給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值;教材2-15
給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找
輸入n個數,最壞情況下用 n + logn
這個題我一開始是遞迴 從底層出發 比到頂層 顯然時間複雜度不允許後來想了一種n時間複雜度的開兩個數用來維護最大值和最小值就可以了,什麼意思呢比如 1 3 6 2 8 4 0 0 8是我們要求的陣列int last = Integer.Min_Value;int cur = I
100層樓有一個雞蛋,如果確定剛好摔碎的那個樓層,最壞情況下最少需要摔多少次?
分析:這道題我們應反過來考慮,就是用a塊石頭扔b次至多一定可分辨層數X(a,b)。先從最簡裝的一塊石頭考慮,很顯然,X(1,1) = 1X(1,2) = 2X(1,3) = 3.X(1,i) = i再考慮二塊石頭,顯而易見X(2,1) = 1對於X(2,2),我們可這樣考慮,當我們扔第一次後,有兩種可能:破和
設計一個演算法,通過一趟遍歷確定長度為n的單鏈表中值最大的結點。
語言:C++ #include <iostream> using namespace std; typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Lin
合併兩個長度分別為m和n的有序表,最壞情況下需要比較m+n-1次
最壞的情況就是交叉的情況: 比如 1 3 52 4 6 設上鍊指針p,下鏈q,每次比較後較小節點依次作為“合併後連結串列的節點”,同時較小鏈指標後移。某鏈指空後不再比較。則樓上所給的第一個例
設計一個演算法,找出只含素因子2,3,5 的第 n 小的數
醜數為值只包含因子 2、 3、 5 的數,14不是醜數因為包含因子7. /*int min(int a,int b){ if(a>b){ return b; }else{
設計一個演算法,刪除遞增有序連結串列中值大於mink且小於maxk的所有元素(mink和maxk是給定的兩個引數,其值可以和表中的元素相同,也可以不同)。
語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li
已知兩個連結串列A和B分別表示兩個集合,其元素遞增排列。請設計一個演算法,用於求出A與B的交集,並存放在A連結串列中。
語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li
程式設計師面試金典: 9.4樹與圖 4.2給定有向圖,設計一個演算法,找出兩個節點之間是否存在一條路徑。
#include <iostream> #include <stdio.h> #include <vector> #include <queue> using namespace std; /* 問題:給定有向圖,設計一個
設計一個演算法,將連結串列中所有結點的連結串列方向“原地”逆轉,即要求僅利用原表的儲存空間,換句話說,要求演算法的空間複雜度為O(1)。
語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li
程式基本演算法習題解析 用分治法設計一個演算法,統計輸入的非空字串中給定字元的個數
首先附上一般思路的程式碼(不用分治法,將輸入字串中的字元從前往後依次比對): // Chapter7_1.cpp : Defines the entry point for the application. // 用分治法設計一個演算法,統計輸入的非空字串中給定字元的個數 #include "
已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構,設計一個演算法,刪除表中值相同的多餘元素
/* 已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構 * 設計一個演算法,刪除表中值相同的多餘元素 * 使得操作後表中所用元素值均不同,同時釋放被刪除的結點空間 */ #include<stdio.h> #inclu
【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否為對稱串。
【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否為對稱串。 所謂對稱串,就是字串從左往右讀和從右往左讀的序列一樣。 例如: abccba是對稱串。 abcabc不是對稱串。 //main.cpp #include <iostream> #include
設計一個演算法,計算出n階乘中尾部零的個數
考慮到只要有5,或者因子為5的數,就可以產生0的尾部。假如1*2*3*4*...*250,那麼250/5=50可以知道,有50個為5的倍數,但是裡面有多少個為25的倍數,125的倍數..., 50/5=10,可知25的倍數有10個,10/5=2,可知125的倍數有兩個,以此
[百度面試題]100層樓,球可能會在某一層樓摔壞,問用2個球,最壞情況下幾次測試可以找出該樓層
該題還可以擴充套件,比如說給更多的球,如3個球,多少次測試可以找出樓層。 分析如下: 用動態規劃解這個問題 設f(a, b)為a個球做b次測試可以測試到的樓層數,可以確定的樓層數即為f(a, b) + 1,因為第1層不需測試,需要測試的樓層號僅僅為[2, f(a, b) +
【Python】設計一個演算法,計算出n階乘中尾部零的個數
1.常見的思路:先求N的階乘,再計算零的個數。 (但是,時間消耗太大) def trailingZeros( n): S = 1 for i in range(1,n+1): S = S * i
請設計一個演算法,給一個字串進行二進位制編碼,使得編碼後字串的長度最短。(哈弗曼編碼)
美團點評2016研發工程師程式設計題(二) 請設計一個演算法,給一個字串進行二進位制編碼,使得編碼後字串的長度最短。 輸入描述: 每組資料一行,為待編碼的字串。保證字串長度小於等於1000。 輸出描述: 一行輸出最短的編碼後長度。 輸入例子: MT-TECH-TEA
設計一個演算法,輸出從u到v的所有最短路徑(採用鄰接表儲存)
思想:用path陣列存放路徑(初始為空),d表示路徑長度(初始為-1),查詢從頂點u到v的最短路徑過程如圖所示: 對應演算法如下: void FindPath(
設計一個演算法,將一個十進位制的數轉化為二進位制
#include<iostream.h> const int StackSize=10; class SeqStack { public: SeqStack(){
程式基本演算法習題解析 用分治法設計一個演算法,找出偽造硬幣
題目: 一個裝有16枚硬幣的袋子,16枚硬幣中有一個是偽造的,並且那個偽造的硬幣比真的硬幣要輕。現有一臺可用來比較兩組硬幣重量的儀器,請使用分治法設計一個演算法,可以找出那枚偽造的硬幣。 首先建立一個有16個int資料型別的陣列,模擬16枚硬幣,真幣賦為1,假幣賦為0。根據二分搜