規定視窗最大範圍容量,持續更新其最大值。
想法:左右雙標,
保證範圍大小,用乙個雙端佇列儲存,
保證:佇列中後面的要比前面的小,卻晚到的替代先到的,因為其晚過期。
(後面更新:去除左右雙標,減少多餘變數,用"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...