演算法之window問題(Java)

2021-08-21 02:45:11 字數 1479 閱讀 8838

規定視窗最大範圍容量,持續更新其最大值。

想法:左右雙標,

保證範圍大小,用乙個雙端佇列儲存,

保證:佇列中後面的要比前面的小,卻晚到的替代先到的,因為其晚過期。

(後面更新:去除左右雙標,減少多餘變數,用"i-num+1"來確定)

**如下:

public static int window(int arr, int num) 

int r = 0;

int duan = new int[arr.length];

linkedlistmax = new linkedlist();

for (int i = 0; i < arr.length; i++)

max.addlast(i);

duan[i] = arr[max.peekfirst()];

if (max.peekfirst() == i - num + 1)

} return duan;

}

大神如下,更新:

public static int getmaxwindow(int arr, int w) 

linkedlistqmax = new linkedlist();

int res = new int[arr.length - w + 1];

int index = 0;

for (int i = 0; i < arr.length; i++)

qmax.addlast(i);

if (qmax.peekfirst() == i - w)

if (i >= w - 1)

} return res;

}

應用如下:

最大值減最小值小於等於arr的子陣列數量:

public static int window2(int arr, int num) 

linkedlistmax = new linkedlist();

linkedlistmin = new linkedlist();

int res = 0;

int i = 0;

int j = 0;

while (i < arr.length)

max.addlast(j);

while (!min.isempty() && arr[min.peeklast()] >= arr[j])

min.addlast(j);

if (arr[max.peekfirst()] - arr[min.peekfirst()] > num)

j++;

}if (max.peekfirst() == i)

if (min.peekfirst() == i)

res += (j - i);

i++;

} return res;

}

Java演算法之「兔子問題」

有乙隻兔子,從出生後第3個月起每個月都生只兔子,小兔子長到第三個月後每個月又生乙隻兔子,假如兔子都不死,問每個月的兔子總數為多少?分析 從第乙個兔子開始,第1個月1只兔子,由於 長到第三個月後每個月又生乙隻兔子 所以第2個月也是1只兔子,第3個月時可以生乙隻兔子,所以總數為2只,這時,其中有乙隻是以...

演算法之樓輪廓問題(Java)

水平面上有 n 座大樓,每座大樓都是矩陣的形狀,可以用乙個三元組表示 start,end,height 分別代表其在x軸上的起點,終點和高度。大樓之間從遠處看可能會重疊,求出 n 座大樓的外輪廓線。外輪廓線的表示方法為若干三元組,每個三元組包含三個數字 start,end,height 代表這段輪廓...

Java之演算法(1)

1 排序 collections類中的sort方法可以一對實現了list介面的集合進行排序 例子 liststaff new linkedlist staff.add sss staff.add ablily staff.add slina staff.sort comparator.reverse...