解题思路:

1、单调栈:因为是循环数组,因此把数组复制三遍,ans 数组复制为2倍长,维护一个单调非递增的栈,栈保存的元素是元组(a[i] , i ),如果后面的值有比栈顶元素的值大,栈顶元素出栈,更新ans[i]的值为让其出栈的值,最后返回ans数组的一半,即最终答案。

2、线段树:数组复制两遍,构建线段树,存的值是当前区间的最大值,当查询 a[i]后面是否有更大的元素时,查询线段树[i+1,i+length]的区间,如果区间最大值比a[i]大,优先访问左子树,如果左子树没有,说明一定在右子树,递归右子树;如果左子树有,递归左子树。

代码:

 1 #单调栈
2 class Solution:
3 def nextGreaterElements(self, nums):
4 a = nums[:]+nums[:]+nums[:]
5 ans = [-1]*len(nums)*2
6 stack = []
7 length = len(nums)
8 for i in range(2*length):
9 while len(stack) > 0:
10 top = stack.pop()
11 stack.append(top)
12 if top[0] < a[i]:
13 ans[top[1]] = a[i]
14 _ = stack.pop()
15 else:
16 break
17 stack.append((a[i], i))
18 return ans[:length]
19
20 #线段树
21 class Node():
22 def __init__(self):
23 self.l = None
24 self.r = None
25 self.max = None
26 class Solution(object):
27 def get_bst(self,a,l,r):
28 n = Node()
29 if l==r:
30 n.max = a[l]
31 return n
32 mid = (l+r)//2
33 n.l = self.get_bst(a,l,mid)
34 n.r = self.get_bst(a,mid+1,r)
35 n.max = max(n.l.max,n.r.max)
36 return n
37 def query(self,root,a,l,r,ql,qr,x):
38 if l==r:
39 return root.max
40 #print(l,r)
41 if root.max < x:
42 return float('-inf')
43 mid = (l + r) // 2
44 if ql<=l and qr>=r:
45 if root.max >x:
46 vl = self.query(root.l,a,l,mid,ql,qr,x)
47 if vl>x:
48 return vl
49 vr = self.query(root.r,a,mid+1,r,ql,qr,x)
50 if vr>x:
51 return vr
52 else:
53 return float('-inf')
54 if ql<=mid :
55 vl = self.query(root.l,a,l,mid,ql,qr,x)
56 if vl>x:
57 return vl
58 if qr>mid:
59 vr = self.query(root.r,a,mid+1,r,ql,qr,x)
60 if vr >x:
61 return vr
62 return float('-inf')
63
64 def nextGreaterElements(self, nums):
65 if not nums:
66 return []
67 length = len(nums)
68 a = nums[:]+nums[:]
69 y = []
70 root = self.get_bst(a,0,len(a)-1)
71 for i in range(length):
72 x = self.query(root,a,0,len(a)-1,i+1,i+length-1,a[i])
73 if x==float('-inf'):
74 y.append(-1)
75 else:
76 y.append(x)
77 return y

LeetCode 503:下一个更大的元素|| (单调栈 or 线段树)的更多相关文章

  1. LeetCode 503. 下一个更大元素 II(Next Greater Element II)

    503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...

  2. Leetcode 503. 下一个更大元素 II

    1.题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应 ...

  3. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  4. Leetcode 503.下一个更大元素

    下一个更大元素 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你 ...

  5. leetcode 496下一个更大的元素I

    单调递减栈来做,time O(n),spaceO(n)需要一个哈希map class Solution { public: vector<int> nextGreaterElement(v ...

  6. LeetCode 556. 下一个更大元素 III(Next Greater Element III)

    556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...

  7. LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35

    496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到  ...

  8. LeetCode:下一个更大元素I【31】

    LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...

  9. 503. 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  10. lintcode-1174.下一个更大的元素 III

    题目描述: 1174. 下一个更大的元素 III 给定一个32位整数n,用同样的数字组成新的32位整数,使得它要比n大,返回最小的这样的数.如果不存在这样的整数,返回-1. 算法思路: 首先将这个数转 ...

随机推荐

  1. Gradle安装配置教程

    一.安装前检查 检查电脑上是否安装JDK,如果没有安装,请查看JDK安装教程:点击查看 如果电脑上已经安装JDK,按Win + R键,输入cmd,然后点击确定 输入java -version,点击回车 ...

  2. kmp的简单应用

    Smiling & Weeping ---- 我只为你一个人写过月亮 题目链接:P4824 [USACO15FEB] Censoring S - 洛谷 | 计算机科学教育新生态 (luogu. ...

  3. KRPANO 最新官方文档中文版(持续更新)

    KRPano最新官方文档中文版分享,后续持续更新: http://docs.krpano.tech/ 本博文发表于:http://www.krpano.tech/archives/849 发布者:屠龙 ...

  4. pandas常用的数据类型,(serises和dataform)

  5. 【RocketMQ】顺序消息实现总结

    全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...

  6. ​python爬虫——爬取天气预报信息

    在本文中,我们将学习如何使用代理IP爬取天气预报信息.我们将使用 Python 编写程序,并使用 requests 和 BeautifulSoup 库来获取和解析 HTML.此外,我们还将使用代理服务 ...

  7. modbus转profinet网关连接ABB变频器在博图程序案例

    modbus转profinet网关连接ABB变频器在博图程序案例 在博图里PLC无需编程利用兴达易控modbus转Profinet网关将ABB变频器接入到西门子网络中,用到设备为西门子1200PLC, ...

  8. Mybatisplus3.5.1+shardingsphere-jdbc5.1.1分表

    注意使用雪花ID的话,查询ID时候必须使用long类型的ID,不要使用MP自带的默认的Serializable类型.否则会提示分片主键id数据类型和分片算法不匹配Inline sharding alg ...

  9. 02-Shell变量

    1.Shell变量 1.1 Shell变量的介绍 变量用于存储管理临时的数据, 这些数据都是在运行内存中的. 1.2 变量类型 系统环境变量 自定义变量 特殊符号变量 2.系统环境变量 2.1 介绍 ...

  10. Go语言系列——Go语言介绍

    文章目录 01-Go语言介绍 一 Go语言介绍 二 Go语言特性 三 Go语言发展(版本/特性) 四 Go语言应用 谁在用 Google Facebook 腾讯 百度 京东 小米 360 应用领域 五 ...