侧滑窗口最大值相关题目

最大树

给出一个没有重复的整数数组,在此数组上建立最大树的定义如下:

  • 根是数组中最大的数
  • 左子树和右子树元素分别是被父节点元素切分开的子数组中的最大值

利用给定的数组构造最大树。

思路:

对于元素cur,只需求得cur的左边的第一个比它大的数和右边的第一个比它大的数,把cur挂在这两个数中的较小的一个上。最后就一定能够得到一个这样的Max_Tree。

首先需要证明不会出现一个森林。

因为整个数组中元素各不相同,所以按照我们的规则,有且只有一个元素不能挂到其他元素上,所以结果一定构成一棵树,不会是森林。

其次证明都是二叉的,不会出现多余两个的儿子。

我们的规则是压栈的时候,如果当前元素比栈顶元素大,那么就弹出栈中的元素,直到栈为空或者栈顶元素比当前元素大。所以,

我们需要证明任意一个元素最多有一个儿子,可以证明任何一个元素最多有过一个右儿子。

a... b 假设b是a的右儿子,那么a是b的左边第一个比b大的数,a到b的数一定比b小,只有b才有可能为其父亲,b右边的数也只有b才有可能为其父亲。

所以a的单边最多有一个儿子。

 1  public TreeNode maxTree(int[] A) {
 2         // write your code here
 3         if (A == null || A.length == 0) {
 4             return null;
 5         }
 6         Stack<Integer> stack = new Stack<Integer>();
 7         HashMap<Integer,Integer> lessBigMap = new HashMap<Integer,Integer>();
 8         for (int i = 0; i < A.length; i++) {
 9             while (!stack.isEmpty() && A[stack.peek()] < A[i]) {
10                 popAndSetMap(stack,lessBigMap,A,i);
11             }
12             stack.push(i);
13         }
14         while (!stack.isEmpty()) {
15             popAndSetMap(stack, lessBigMap, A, null);
16         }
17         TreeNode[] nodes = new TreeNode[A.length];
18         for (int i = 0; i < A.length; i++) {
19             nodes[i] = new TreeNode(A[i]);
20         }
21         TreeNode head = null;
22         for (Map.Entry<Integer, Integer> entry : lessBigMap.entrySet()) {
23            Integer son = entry.getKey();
24            Integer father = entry.getValue();
25            if (father != null) {
26                if (father > son) {
27                    nodes[father].left = nodes[son];
28                }
29                else {
30                    nodes[father].right = nodes[son];
31                }
32            }
33            else {
34                head = nodes[son];
35            }
36         }
37         return head;
38     }
39     public void popAndSetMap(Stack<Integer> stack, Map<Integer,Integer> map, int[] A, Integer r) {
40         int mid = stack.pop();
41         if (r != null && !stack.isEmpty()) {
42             map.put(mid, A[r] < A[stack.peek()] ? r:stack.peek());
43         }
44         else if (!stack.isEmpty()) {
45             map.put(mid, stack.peek());
46         }
47         else {
48            map.put(mid, r);
49         }
50     }

时间: 2024-10-16 06:09:33

侧滑窗口最大值相关题目的相关文章

堆的相关题目—滑动窗口

1.数据流滑动窗口平均值 描述 给出一串整数流和窗口大小,计算滑动窗口中所有整数的平均值. 样例 样例1 : MovingAverage m = new MovingAverage(3); m.next(1) = 1 // 返回 1.00000 m.next(10) = (1 + 10) / 2 // 返回 5.50000 m.next(3) = (1 + 10 + 3) / 3 // 返回 4.66667 m.next(5) = (10 + 3 + 5) / 3 // 返回 6.00000来源

剑指offer--滑动窗口最大值

滑动窗口最大值 题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1

生成窗口最大值数组

1.生成窗口最大值数组 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置. 例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时: [4 3 5] 4 3 3 6 7 窗口中最大值为5 4 [3 5 4] 3 3 6 7 窗口中最大值为5 4 3 [5 4 3] 3 6 7 窗口中最大值为5 4 3 5 [4 3 3] 6 7 窗口中最大值为4 4 3 5 4 [3 3 6] 7 窗口中最大值为6 4 3 5 4 3 [3 6 7] 窗口中最大

一道数组求连续子集最大值的题目。

昨天晚上花了几个小时,终于把这个题目给实现了.后面再优化.今天先贴出来晒晒. 据说是浙江大学计算机系一道考研题目(给定一个有符号整形数组,输出和胃最大并且连续的子数组).当初只会算最大值,不会返回一个数组作为结果.花了点时间,把程序改进了一下.有些不成熟.先放放.好歹是实现了. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SumMax { class

LeetCode: Palindrome 回文相关题目

LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioning II 解题报告 Leetcode:[DP]Longest Palindromic Substring 解题报告 LeetCode: Valid Palindrome 解题报告

获取 窗口 进程 相关信息

GameHwnd:= FindWindow(nil,'对对碰角色版'); //得到进程ID GetWindowThreadProcessId(GameHwnd,GamePid); //得到进程句柄 GameProcess:= OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE,False,GamePid); //读取进程内存 ReadProcessMemory(GameProcess,Pointer($0048F128),@sitnum,4,readb

九度 Online Judge 之《剑指 Offer》一书相关题目解答

前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus Torvalds 所言“Talk is cheap, show me the code!",详见托管在 Github 的源码:点击打开链接(核心部分有注释). 难度总结:有些可以不必要像书中那样保存中间结果,直接输出,也就可以不使用书中的算法:有些题目在书中题目的基础上加了更多的要求,也更难实现一点.

滑动窗口最大值的golang实现

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1

5.生成窗口最大值数组

题设:给一个整型数组arr和一个大小为w的窗口,窗口从最左边滑到最右边,窗口每次向右边滑一个位置,例如arr={4,3,5,4,3,6,7}时,w=3,此时生成的窗口最大值数组为{5,5,5,6,7}. 思路:给定一个长度为L的数组arr ,当滑动窗口大小 为w时,则生成的窗口最大值数组maxWindow长度为L-w+1,;用一个双端队列queue(可以用LinkedList来模拟)来存储滑动窗口的最大值,假设当窗口移动到位置i时,当queue为空时直接将i添加到queue的队尾,当queue不