華為OD機試-- 亂序整數(shù)序列兩數(shù)之和絕對值最小

題目
給定一個隨機的整數(shù)(可能存在正整數(shù)和負(fù)整數(shù))數(shù)組 nums,請你在該數(shù)組中找出兩個數(shù),其和的絕對值(|nums[x]+nums[y]|)為最小值,并返回這個兩個數(shù)(按從小到大返回)以及絕對值。
每種輸入只會對應(yīng)一個答案。
但是,數(shù)組中同一個元素不能使用兩遍。
輸入描述
一個通過空格分割的有序整數(shù)序列字符串,最多1000個整數(shù),且整數(shù)數(shù)值范圍是 [-65535, 65535]。
輸出描述
兩數(shù)之和絕對值最小值
示例1 輸入輸出示例僅供調(diào)試,后臺判題數(shù)據(jù)一般不包含示例
輸入
-1 -3 7 5 11 15
輸出
-3 5 2
說明
因為 |nums[0] + nums[2]| = |-3 + 5| = 2 最小,所以返回 -3 5 2。
思路
1:兩個數(shù)字的之和絕對值最小,那么有以下幾種情況
兩個數(shù)字都是負(fù)數(shù),那么是最大的倆負(fù)數(shù)的和的絕對值最小。
兩個數(shù)字都是正數(shù),那么是最小的倆整數(shù)的和的絕對值最小。
一個數(shù)是負(fù)數(shù)一個數(shù)是正數(shù),此時情況需要特殊處理。因為需要絕對值最小,那么對于一個負(fù)數(shù) -N 顯然想找 +N ,? 我們遇到一個負(fù)數(shù)x,需要找非負(fù)數(shù)區(qū)的最接近于|x|的的那個數(shù)。
2:分類討論完之后就簡單了,先給數(shù)組排好序。對于第一種和第二種情況,一個比較核心的操作:找到最靠近或者等于0的位置。因為只有找到絕對值最小的位置,后面才好判斷選哪個數(shù)。
3:可以看到上面三種情況可以抽象出一個方法,找到一個排序數(shù)組中最靠近目標(biāo)數(shù)target的位置-> 明顯就退化成比較簡單的二分查找問題。
4:二分查找的基本工作原理:將要查找的元素一分為兩半然后一半一半的查找
? ? ? ? 通過不停的縮小查找范圍,改變L,R M,,直到它們?nèi)谝粋€元素上,并且這個元素等于查找元素,每次L和R移動的步長為1,我們這里是找到最靠近的即可。
Java 實現(xiàn):https://renjie.blog.csdn.net/article/details/130667202
Python實現(xiàn):https://renjie.blog.csdn.net/article/details/128357837
C++ 實現(xiàn):https://renjie.blog.csdn.net/article/details/127195062
JavaScript實現(xiàn):https://renjie.blog.csdn.net/article/details/130667212
C實現(xiàn):https://renjie.blog.csdn.net/article/details/130495591