當(dāng)前位置:
首頁 >
算法--微软面试题:求一个整数数组元素间最小差值
發(fā)布時間:2025/3/20
45
豆豆
生活随笔
收集整理的這篇文章主要介紹了
算法--微软面试题:求一个整数数组元素间最小差值
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Q題目
有一個整數(shù)數(shù)組,請求出兩兩之差絕對值最小的值,記住,只要得出最小值即可,不需要求出是哪兩個數(shù).
A解法
方案一:最愚笨的辦法——暴力窮舉
利用數(shù)組中所有數(shù)據(jù)兩兩相減的對比來求出這個最小差值。 缺點:效率低,浪費資源代碼如下:
package 微軟數(shù)組最小差值;import java.util.ArrayList; import java.util.Collections;/*** 有一個整數(shù)數(shù)組,請求出兩兩之差絕對值最小的值,記住,只要得出最小值即可,不需要求出是哪兩個數(shù)* @author Administrator**/ public class Test1 {public static void main(String[] args) { // int[] arr={-2,2,5,8,11};int[] arr={-2,10,5,87,11,2};int min=getMinSubtract(arr);System.out.println("==min==="+min);}//1.暴力窮舉法,求出所有數(shù)的差public static int getMinSubtract(int[] arr){int minus=0;//1.若用數(shù)組處理,先計算數(shù)組長度arr.length的階乘,因為比較麻煩,這里就不用數(shù)組了//2.集合處理:存儲兩數(shù)的差值ArrayList<Integer> list=new ArrayList<>();for(int i=0;i<arr.length-1;i++){for(int j=i+1;j<arr.length;j++){minus=Math.abs(arr[i]-arr[j]);list.add(minus);}}System.out.println("所有差值為:"+list);int min=Collections.min(list);return min;}}方案二:先排序,再求相鄰兩個數(shù)的差值
優(yōu)點:效率高
代碼如下:
package 微軟數(shù)組最小差值;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections;public class Test2 {public static void main(String[] args) {int[] arr={-2,10,5,87,11,2};int min=getMinSubtract02(arr);System.out.println("==min==="+min);}//2.排序后,再求最小值public static int getMinSubtract02(int[] arr){Arrays.sort(arr);System.out.println("排序后的數(shù)組:"+Arrays.toString(arr));//這里同樣采用集合,不用數(shù)組ArrayList<Integer> list=new ArrayList<>();int start=arr[0];for (int i = 1; i < arr.length; i++) {int minus=arr[i]-start;//因為數(shù)組時按從小到大排序的,所以不用去絕對值list.add(minus);start=arr[i];}System.out.println("所有差值為:"+list);int min=Collections.min(list);return min;} }方案三:設(shè)立輔助數(shù)組(不排序,直接求相鄰兩個數(shù)的差值)
思路分析:
設(shè)立輔助數(shù)組。以下是設(shè)立輔助數(shù)組的基本思路
設(shè)輔助數(shù)組為Bn.原來題目中給定的數(shù)組是An,則Bn等于:
B1 = A1 - A2;
B2 = A2 - A3;
B3 = A3 - A4;
……
Bn-1 = An-1 - An.
注意,Bn的長度是n-1,正好比An要小一個。聰明的同學(xué)看到這個輔助數(shù)組,立馬就能猜到原因了,因為這樣做的話,我們能夠把這道看似無從下手求出最優(yōu)解的問題轉(zhuǎn)化為求Bn的絕對值最小的最長連續(xù)子序列和,因為Bn的連續(xù)子序列和便是An任意兩數(shù)之差(注意,由于題目要求的是絕對值最小,所以求出A1-A2等效于得出A2-A1),例如:
A2 - A5 = B2 + B3 + B4 = A2 - A3 + A3 - A4 + A4 - A5 = A2 - A5
實際上,任何Ai - Aj(i<j) = sigma(k=i -> k=j-1)(k)。 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的算法--微软面试题:求一个整数数组元素间最小差值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Servlet】Request/Res
- 下一篇: a 标签中调用js的几种方法