題目描述:給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列 及滑動視窗的大小w,如果w為3那麼一共存在6個滑動視窗:, , , , , ,他們的最大值分別為。
時間複雜度為o(n*w)時間複雜度很好實現, 時間複雜度為o(n)的時間複雜度用單調佇列實現
//思路,形成乙個單調鍊錶,在頭部序號距離此時的序號小於等於w數內,在鍊錶個數滿w後每個頭部元素都是最大值。
//不過期時頭部最大值不變,當過期後會被踢出,下乙個值充當最大值
public static listgetmaxwindow(int arr, int w)
gmax.addlast(i);
//如果最大值一直停留在滑動視窗前面則說明這個最大值過期,判斷依據為 gmax頭部序號==i-w;
if(i-w == gmax.peekfirst())
//如果gmax中值沒有過期,則在大於w後所有頭部都是最大值
if(i >= w-1)
}return list;
}
2.搞清楚了上述的最大視窗題可以引申出下面的題目
最大值減去最小值小於或等於 k 的子陣列數量
給定陣列 arr 和整數 k,共返回有多少個子陣列滿足如下情況:
max(arr[i..j]) - min(arr[i..j]) <= k
max(arr[i..j])表示子陣列 arr[i..j]中的最大值,min(arr[i..j])表示子陣列 arr[i..j]中的最小值。
思路: 如果對於暴力解法時間複雜度為o(n^2),而同樣本問題與上述問題一樣相當於w不停變化的乙個滑動視窗問題,並且雙端佇列要位置乙個最大佇列乙個最小佇列來求出最大值與最小值的差。
有兩個推論在解題的時候用到,
(1)arr[i…j])滿足題目條件,則arr[i…j-1])、arr[i…j-2])…也滿足條件,即arr[i…j])的子陣列滿足條件,因為arr[i…j-1])的最大值只可能小於等於arr[i…j]),arr[i…j-1])的最小值只可能大於等於arr[i…j])。
(2)同理arr[i…j])不滿足條件,則包含arr[i…j])的子陣列都不滿足條件
由以上思路,**實現如下:
public int getmax(int arr, int num)
gmin.addlast(j);
while(!gmax.isempty() && arr[gmax.getlast()] <= arr[j])
gmax.addlast(j);
}//第二個推論
if(arr[gmax.getfirst()] - arr[gmin.getfirst()] > num)
j++;
}//用到第乙個推論
res += j-i;
//i已經過期,提出i
if(gmax.peekfirst() == i)
if(gmin.peekfirst() == i)
i++;
}return res;
}
最大值最小值問題
看了不是很懂,先把別人的 放著,日後在研究。程式8 3 5.cpp 定義控制台應用程式的入口點。include stdafx.h 目標學會用猜數字 二分 的方法,換個角度來解決問題 include include includeconst int maxn 100000 int a maxn n,m...
最大值 最小值
求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...
int float double 最大值,最小值
中沒有double的最大最小值。如果輸出的比如 100lf輸出2.23432432,沒有達到100位,則最後2後面不一定都是0。原文見view plaincopy to clipboardprint?coder acboy date 2010 3 1 include include using na...