假设一个固定大小为W的窗口,依次划过arr,假设每次返回最大数,算法设计
`public class mathTest {
/**假设一个固定大小为W的窗口,依次划过arr,假设每次返回最大数,
*
* @param arr = [4,3,5,4,3,3,6,7]
* @param w = 3
* @return
*/
public static int[] getRes(int arr[],int w) {
if ( w< 0 || arr == null || arr.length < w){
return null;
}
//创建双端队列, 其中放的位置是arr[i],头代表(大->小)尾 L----R L表示左边第一个元素下标,R表示右边第一个元素下标
LinkedList<Integer> linkedList = new LinkedList<>();
//值的个数
int[]res = new int[arr.length - w + 1];
int index = 0;
for (int i = 0;i<arr.length;i++){//当前让i->[i]窗口的时候,i就是r
//当从R->放值的时候,可以放在比他大的数后,或者空
while(!linkedList.isEmpty() && arr[linkedList.peekLast()] <= arr[i]){
//移除小的数字
linkedList.pollLast();
}
//添加数字
linkedList.addLast(i);
//当添加的数字小于 如果没有形成w的长度时候,不让弹出,i-w 表示过期下标
if (linkedList.peekFirst() == i- w ){
linkedList.pollLast();
}
//满足条件 塞值
if (i >= w-1){
res[index++] = arr[linkedListpeekFirst()];
}
}
return res;
}
public static void main(String[] args) {
int arr[]={4,3,5,4,3,3,6,7};
int arrs[] = getRes(arr,3);
for (int i = 0; i<arrs.length ;i++){
System.out.print(arr[arrs[i]]);
}
}
}
每日都会更新1-2道算法题,喜欢算法的小伙伴 点关注多留言
`