滑动窗口法算法(matlab、java)

时间:2025-02-19 07:53:18
  • package cn.itcast_06;
  • import ;
  • import ;
  • import ;
  • import ;
  • import ;
  • /**
  • * 返回一个n-w+1 长度的数组, 每个元素代表每个窗口中的最大值。
  • */
  • public class SlideWindow {
  • /**
  • * array:源数组
  • * w:窗口大小
  • * 时间复杂度O(N*w)
  • */
  • public int[] moveWindow(int[] array, int w) {
  • int[] result = new int[array.length - w + 1];
  • for (int i = 0; (i + (w - 1)) < array.length; i++) {
  • int[] newArr = (array, i, i + w);
  • Arrays.sort(newArr); // 左闭右开
  • result[i] = newArr[w - 1];
  • }
  • return result;
  • }
  • /**
  • * 最优解: 时间复杂度为O(N)
  • * 利用双端队列
  • */
  • public Integer[] moveWindow1(Integer[] arr,int n, int w) {
  • if(w == 1){
  • return arr; //如果窗口大小为1, 直接返回数组即可
  • }
  • Deque<Integer> deq = new LinkedList<>(); //双端队列
  • List<Integer> res = new ArrayList<>();
  • for(int i=0; i<n; i++){
  • //如果qmax为空,或者取出当前deque队尾存放的下标j 满足 arr[j] > array[i],
  • //直接把下标i放进deque的队尾.
  • if(() || arr[()] > arr[i]){
  • (i);
  • }else{
  • //如果arr[j] <= array[i],则一直从deque的队尾弹出下标。
  • //直到某个下标在deque中对应的值大于arr[i],就把i放入deque的队尾。
  • while(!() && arr[()] <= arr[i]){
  • ();
  • }
  • (i);
  • }
  • //如果deque队头的下标等于i-w,弹出deque当前队头下标.
  • if(() == i-w){
  • ();
  • }
  • //如果w窗口等于3的话,那么从i=2开始,产生的才是窗口的最大值。
  • if(i < w-1){
  • continue;
  • }
  • res.add(arr[()]);
  • }
  • return (Integer[])(new Integer[n-w+1]);
  • }
  • }