nli-MiniLM2-L6-H768应用场景:教育题库中题目与答案蕴含关系校验
2026/4/28 6:03:41
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter
package live.every.day.ProgrammingDesign.CodingInterviewGuide.StackAndQueue; import java.util.Arrays; import java.util.LinkedList; /** * 生成窗口最大值数组 * * 【题目】 * 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 * 如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口的最大值。 * 请实现一个函数。 * 输入:整型数组arr,窗口大小为w。 * 输出:一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。 * * 【难度】 * 中等 * * 【解答】 * 如果数组长度为N,窗口大小为w,如果做出时间复杂度O(Nxw)的解法是不能让面试官满意的,本题要求面试者想出时间复杂度O(N) * 的实现。 * * 本题的关键在于利用双端队列来实现窗口最大值的更新。首先生成双端队列qmax,qmax中存放数组arr中的下标。 * * 假设遍历到arr[i],qmax的放入规则为: * 1、如果qmax为空,直接把下标i放进qmax,放入过程结束。 * 2、如果qmax不为空,取出当前qmax队尾存放的下标,假设为j。 * 1)如果arr[j]>arr[i],直接把下标i放进qmax的队尾,放入过程结束。 * 2)如果arr[j]<=arr[i],把j从qmax中弹出,继续qmax的放入规则。 * 假设遍历到arr[i],qmax的弹出规则为: * 如果qmax队头的下标等于i-w,说明当前qmax队头的下标已过期,弹出当前队头的下标即可。 * 根据如上的放入和弹出规则,qmax便成了一个维护窗口为w的子数组的最大值更新的结构。 * * 上述过程中,每个下标值最多进qmax一次,出qmax一次。所以遍历的过程中进出双端队列的操作时间复杂度为O(N),整体的时间复 * 杂度也为O(N)。具体过程参看如下代码中的getMaxWindow方法。 * * @author Created by LiveEveryDay */ public class GenerateWindowMaxArray { public static int[] getMaxWindow(int[] arr, int w) { if (arr == null || w < 1 || arr.length < w) { return null; } LinkedList<Integer> qmax = new LinkedList<>(); int[] res = new int[arr.length - w + 1]; int index = 0; for (int i = 0; i < arr.length; i++) { while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[i]) { qmax.pollLast(); } qmax.addLast(i); if (qmax.peekFirst() == i - w) { qmax.pollFirst(); } if (i >= w - 1) { res[index++] = arr[qmax.peekFirst()]; } } return res; } public static void main(String[] args) { int[] arr = {4, 3, 5, 4, 3, 3, 6, 7}; int w = 3; int[] res = getMaxWindow(arr, w); System.out.printf("The result array is: %s", Arrays.toString(res)); } } // ------ Output ------ /* The result array is: [5, 5, 5, 4, 6, 7] */