找出距離最近的三個點

2021-06-04 19:05:10 字數 853 閱讀 5524

問題描述:

給定三個陣列a,b,c,從這三個陣列中分別取乙個元素a,b,c,使得|a-b|+|b-c|+|c-a| 最小。

【方案一】

《直接列舉法》

該題最直接的方法是列舉,即列舉三個陣列組成的所有三元組,然後求出|a-b|+|b-c|+|c-a| 最小值。

【方案二】

《巧妙轉化法》

一般而言,見到絕對值號,首先想到的應是去絕對值號。

列舉6種a,b,c之間的大小關係,如a>=b>=c,則|a-b|+|b-c|+|c-a| =2(a-c)。

可以得到結論:|a-b|+|b-c|+|c-a|只與a,b,c中最大值和最小值有關。這個很容易通過畫數軸證明,

在數軸上,三個點兩兩距離之和記為最大值與最小值距離的兩倍。

得到上面結論後,怎樣高效的得到|a-b|+|b-c|+|c-a| 最小值呢?

想一下極端情況:將三個陣列合併成乙個陣列,對該陣列排序後,如果相鄰三個數正好來自三個不同陣列,

則|a-b|+|b-c|+|c-a| 最小值肯定可通過相鄰三個數獲得。這樣,僅掃瞄一遍便可求出該最小值。

將該極端情況的演算法擴充套件到一般情況的演算法:先對三個陣列進行排序,然後用三個指標分別指向三個陣列起始位置,

獲取三個指標指向的元素中最大值max和最小值min,計算2(max-min),之後將最小元素對應的指標前移一位,

重複以上過程,保留2(max-min)的最小值即可。

void print_triple_with_min_dist(int *a, int *b, int *c, int n, int m, int s)

cout << mindis << endl;

}

爬蟲三個點

2 解析網頁就是從整個網頁的資料中提取想要的資料。類似於你在頁面中想找到產品的 就是你要提取的資料。3 儲存資料也很容易理解,就是把資料儲存下來。我們可以儲存在csv中,也可以儲存在資料庫中。三個流程的技術實現 下面列出三個流程的技術實現,括號裡是對應的章節。1.獲取網頁 獲取網頁的基礎技術 req...

golang 三個點的用法

已經忘了這是第幾次查這個用法了,還是記一下吧 本文同時發表在 在golang中,三個點一共會用在四個地方 話說三個點的官方說法是什麼?變長的函式引數 如果最後乙個函式引數的型別的是.t,那麼在呼叫這個函式的時候,我們可以在引數列表的最後使用若干個型別為t的引數。這裡,t在函式內部的型別實際是t.fu...

go中的三個點( )

表示params可能是多個引數 func main func eg str string,params inte ce var arr intvar bac 3 string fmt.println bac c b a 遍歷 組裝成新的陣列data,使用.var data string fmt.pr...