2023年專業408的演算法題

2021-10-09 19:16:28 字數 2253 閱讀 4867

定義三元組(a,b,c)(a,b,c均為整數)的距離d=∣

a−b∣

+∣b−

c∣+∣

c−a∣

d=|a-b| + |b-c|+|c-a|

d=∣a−b

∣+∣b

−c∣+

∣c−a

∣。給定3個非空整數集合s1,s2和s3,按公升序分別儲存在3個陣列中。請設計一種盡可能高效的演算法,計算並輸出所有可能的三元組(a,b,c)(a∈s

1,b∈

s2,c

∈s

3a \in s1,b \in s2,c \in s3

a∈s1,b

∈s2,

c∈s3

)中的最小距離。

例如,s1=,s2=,s3=,則最小距離為2,相應的三元組為(9,10,9)。

思路:暴力求解所有可能

#include

#include

#include

#include

#include

intmain()

,s2=,s3=

int s1=

;int s2=

;int s3=

;int res[3]

;//初始化

memset

(res,0,

sizeof

(res));

//計算長度

int extent1 =

sizeof

(s1)

/sizeof

(*s1)

;int extent2 =

sizeof

(s2)

/sizeof

(*s2)

;int extent3 =

sizeof

(s3)

/sizeof

(*s3)

;//定義int最大值,用於向下比較

int minlength = int_max;

for(

int i =

0;i < extent1;i++)}

}}for(

auto i:res)

printf

("minlength is %d"

, minlength)

;return0;

}

時間複雜度:o(extent1extent2extent3)

#include

#include

#include

#include

#include

#define xismin(x, y, z) (((x) <= (y)) && ((x) <= (z)))

intmain()

,s2=,s3=

int s1=

;int s2=

;int s3=

;int res[3]

;memset

(res,0,

sizeof

(res));

int extent1 =

sizeof

(s1)

/sizeof

(*s1)

;int extent2 =

sizeof

(s2)

/sizeof

(*s2)

;int extent3 =

sizeof

(s3)

/sizeof

(*s3)

;int minlength = int_max, dis;

int i =

0, j =

0, k =0;

while

(i < extent1 && j < extent2 && k < extent3 && minlength >0)

if(xismin

(s1[i]

,s2[j]

,s3[k]

)) i++

;elseif(

xismin

(s2[j]

,s3[k]

,s1[i]

)) j++

;else k++;}

for(

auto i:res)

printf

("minlength is %d"

, minlength)

;return0;

}

時間複雜度:o(extent1+ extent2+ extent3)

2023年408的演算法題

設q指向末尾第k個結點,p指向最後乙個結點 假設為n 那麼當k小於等於鍊錶長度時,n k 1 n k 1 n k 1 為p和q結點相差的距離。故有,當p移動k 1個結點後,q再開始移動,當p指向最後乙個結點時,q剛好指向倒數第k個結點 如果k大於鍊錶長度,則p指向鍊錶最後乙個結點後,q都未曾移動,即...

2023年的408演算法題

思路一 使用hash對映打表,每出現一次次數加1,如果次數有超過n 2,則存在主元素,反之,則不存在。缺點 需要輔助陣列 思路二 兩兩相互抵消。如果陣列中存在大於一般的相同元素,首先假設第乙個元素為主元素的候選元素 統計個數為1 如果目前元素統計的個數大於0,遇到相同的數字 個數加1,不同的數字 個...

2023年的408演算法題

因為時間高效,則採用空間換時間的方法。方法 打表計數 陣列大小設為n,即元素的個數 遍歷陣列出現number,如果範圍在 1,n 之間,則記 number 1 次數為1,遍歷完陣列後,指標i從 0,n 開始遞增判斷錶值是否為0,是則跳出迴圈,最後輸出i 1。include include intfu...