day24

文章提供了两个Java程序,分别实现了数组的旋转操作和滑动窗口算法。旋转数组程序通过读取输入并重新排列数组元素来实现顺时针旋转;滑动窗口程序使用双端队列维护窗口内的最小值,动态计算每个固定大小窗口的最小值。
摘要由CSDN通过智能技术生成

HOLY SHIFT!!!!已经第二十四天了,比赛的考场已经出来了,但是具体的位置还不知道,今天被骗了20块,我测你们ma,干就完了

1.旋转(打卡题)

package daka;

import java.util.*;
/*旋转
 * 
 */
public class xuanzhuan {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//3
        int m = sc.nextInt();//4
        
        int a[][] = new int [n][m];
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {
                a[i][j] = sc.nextInt();
            }
        }
        
        int b[][] = new int [m][n];

//        for(int i=0;i<m;i++) {                
//                b[i][0] = a[n][i]; 
//        }
//        
//        for(int j=0;j<m;j++) {
//            b[j][1] = a[n-1][j];
//        }
//        
//        for(int p=0;p<m;p++) {
//            b[p][2] = a[n-2][p];;
//        }
        
        for(int x=0;x<m;x++) {
            for(int y=0;y<n;y++) {
                b[x][y] = a[n-y-1][x];
            }
        }
        
        for(int i=0;i<m;i++) {
            int cont =0;
            for(int j=0;j<n;j++){
                System.out.print(b[i][j]+" ");
                cont++;
                if(cont == n) {
                    System.out.println();
                }
            }
        }
        sc.close();
    }
}

2.滑动窗口

package zshid;

import java.util.*;
/*滑动窗口
 * 在一个数组或序列上,选择一个固定的窗口大小,从左到右每次滑一格,计算题目的要求
 * 
 * 实现的数据结构:
 * 双端队列
 * 1.(支持在队头和队尾进行元素的插入和删除操作)
 * 2.队列中的数据是单调递增或递减的
 * 3.队列中保存的是数组的下标
 * 4.每次向右滑动队头弹出,新的元素插入队尾
 * 
 * 窗口每次向后移动,若新的数字比队尾的大,就直接入队列
 * 比队尾的小,则弹出队列中所有比新的数字小的值,保证当前队列的队头是当前窗口中最小的值
 */
public class hdck {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n =sc.nextInt();
        
        //mins数组的下标为当前窗口的左边界
        int [] mins = new int [n];
        int [] record = new int [n];
        int [] arr = new int [n];
        
        for(int i=0;i<n;i++) {
            arr[i] = sc.nextInt();
        }
        
        int k = sc.nextInt();//每次滑动的窗口的大小
        //保存当前窗口的最小值(数组的下标)
        LinkedList<Integer> qmin = new LinkedList<>();
        
        //初始化双端队列 小->大
        for(int i=0;i<=k;i++) {
            //当有更小的进入队列时,大的从队尾弹出
            while(!qmin.isEmpty() && i <n && arr[qmin.peekLast()] >= arr[i]) {
                qmin.pollLast();
            }
            
            //进入队列(添加到队列尾部)
            qmin.addLast(i);
        }
        //窗口的左边界
        mins[0] = arr[qmin.peekFirst()];
        
        for(int i=1;i<n;i++) {//窗口每次向后移动一格
            //超出当前窗口左边界的需要弹出队列
            if(!qmin.isEmpty() && i-k>0 && qmin.peekFirst()<i-k) {
                qmin.pollFirst();//队头弹出
            }
            
            //有更小的进入队列时,大的从队尾弹出
            while(!qmin.isEmpty() && i+k<n && arr[qmin.peekLast()] >= arr[i+k]) {
                qmin.pollLast();
            }
            //当前元素加入队尾
            if(i+k<n) {
                qmin.addLast(i+k);
            }
            //将队头元素加入mins数组,
            mins[i] = arr[qmin.peekFirst()];
        }
        
            for(int i=0;i != mins.length;i++) {
                System.out.print(mins[i] + " ");
                    }
        
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

螺上螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值