演算法題巧解之陣列排序後相鄰最大差值

2021-08-20 08:38:11 字數 1389 閱讀 6583

最近在複習演算法知識,然後今天在學習的過程中遇到了乙個很經典的問題,所以做筆記記錄一下 ~_~

題目:給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度o(n)

例:

陣列 arr =[1,3,2,5,8,6]

輸出結果:2

看到這個題目我的第一反應是通過多次遍歷的這樣暴力手段來解決(請原諒我的菜和無知),但後來了解到這個題目可以用一種十分巧妙的方法來解決。

思路:

這個巧妙的方法和桶排序有很大的相似之處。首先,定義乙個長度為待排序陣列(下文中用arr代替)的長度+1的陣列用來抽象的表示桶;將arr中的最小值和最大值分別放置在桶的頭部和尾部,將arr中數的大小範圍分成 arr.length+1個部分,也就是桶的個數,每個桶存連續長度的乙個範圍的數,但是為了減少不必要的操作,只存乙個範圍內的最大值和最小值,相鄰最大差一定是某個桶的最大值和它相鄰的下乙個桶的最小值的差。

根據思路可以寫出下面**:

function getmaxaftersort(arr)

var len = arr.length;

var min = number.max_value;

var max = number.min_value;

// 獲取最大值和最小值

for(var i=0;imin = min > arr[i] ? arr[i] : min;

max = max > arr[i] ? max : arr[i];

}if(min == max)

return

0; // 每個桶資訊的描述,分別為存在標識,最小值,最大值

var hasnum = new array(len+1);

var mins = new array(len+1);

var maxs = new array(len+1);

var sign;

for(var i=0; isign = judgebucket(arr[i],len,min,max);

hasnum[sign] = true;

mins[sign] = hasnum[sign] ? math.min(mins[sign],arr[i]):arr[i];

maxs[sign] = hasnum[sign] ? math.max(maxs[sign],arr[i]):arr[i];

}var res = 0;

lastmax = maxs[0];

// 遍歷返回最大差值

for(var j=1;j1;j++)

}return res;

}// 返回num存入的桶的下標

function judgebucket(num,len,min,max)

陣列排序後相鄰數的最大差值

題目 輸入n個數,求這n個數排序後,相鄰數的最大差值。要求時間複雜度為o n 我們可以用桶排序的思想,把n個數分到 n 1個桶中,然後我們用桶存連續長度的乙個範圍的數,每個桶負責的範圍是 maxn minn n maxn是序列中最大的數,minn是序列中最小的數 如果乙個數為num,那麼這個數應存進...

無序陣列排序後的最大相鄰差

無序陣列排序後的最大相鄰差 public class maxdis int d max min 1.如果 max和min相等則說明陣列中所有元素都相等則,返回0 if d 0 2.初始化桶 int bucketnum array.length bucket buckets newbucket buc...

桶 求無序陣列排序後,最大的相鄰差值

引言 無限長的無序陣列 正負零都有可能。求出排序後最大的相鄰的差值 時間複雜度o n 且要求不能用非基於比較的排序 思路1.找出陣列中的最大元素,分配最大元素 1個桶,對桶等分如一號桶 0 9 二號桶 10 19 2.因為元素最大是n,所以準備了n 1個桶,所以肯定最小桶和最大桶肯定有數,中間有空桶...