作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/minesweeper/description/

题目描述

Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn’t exist, output -1 for this number.

Example 1:
Input: [1,2,1]
Output: [2,-1,2]
Explanation: The first 1's next greater number is 2;
The number 2 can't find next greater number;
The second 1's next greater number needs to search circularly, which is also 2.

Note: The length of given array won’t exceed 10000.

题目大意

找出一个数组中每个数字的下一个更大的数字,可以看做是循环数组。

解题方法

暴力解法

额,直接使用暴力解法的话。可以使用%符号来实现循环数组。可惜超时了。

代码:

class Solution(object):
def nextGreaterElements(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
_len = len(nums)
res = [-1] * _len
for i in xrange(_len):
for j in xrange(i + 1, _len * 2):
if nums[j % _len] > nums[i]:
res[i] = nums[j % _len]
break
return res

单调递减栈

下面的引用自 http://blog.csdn.net/Cloudox_/article/details/62881181

在遍历数组的过程中,如果是往后遇到大的数,那就是第一个更大的数,如果一直遇到不断小的数,才会一直找不到,我们可以用一个栈来记录,遇到比栈顶小的数字就放入栈中,遇到比栈顶大的数字就说明这是栈顶数字的下一个更大的数,就将其放在结果数组的对应位置上,栈顶的元素出栈,继续比较新的栈顶的数,如果还是大,那么继续记录,出栈,直到栈顶的数比新数要小,那么就可以将新数入栈了。因为我们要将找到的更大的数放在对应位置上,所以栈中记录的应该是元素位置,而不是具体的数字,但比较的时候还是比较原来的数组中这个位置的数字,这一点要想清楚。此外,因为会出现循环寻找的情况,所以数组我们可能遍历两次。这个做法会快很多。

官方解读的ppt做的很好~也推荐看下:https://leetcode.com/problems/next-greater-element-ii/solution/

注意,栈里保存的是索引,一定不要忘记。

同样适用单调栈的题目有:962. Maximum Width Ramp

代码:

class Solution(object):
def nextGreaterElements(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = [-1] * len(nums)
stack = []
for i in range(len(nums)) * 2:
while stack and (nums[stack[-1]] < nums[i]):
res[stack.pop()] = nums[i]
stack.append(i)
return res

C++代码如下:

class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
const int N = nums.size();
vector<int> res(N, -1);
stack<int> stack;
for (int i = 0; i < N * 2; i++) {
while (!stack.empty() && nums[stack.top()] < nums[i % N]) {
res[stack.top()] = nums[i % N];
stack.pop();
}
if (i < N)
stack.push(i);
}
return res;
}
};

日期

2018 年 3 月 6 日
2018 年 12 月 28 日 —— 元旦假期到了

最新文章

  1. 深入super,看Python如何解决钻石继承难题 【转】
  2. Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
  3. Atitit usrQBK13 html dsl 规范与解决方案
  4. 异步加载JS的4种方式(详解)
  5. Linux查看端口使用状态、关闭端口方法
  6. JavaScript创建表格的两种方式
  7. 一张图看懂片式多层陶瓷电容器(MLCC)
  8. 理光C5502A 打印模糊问题
  9. Android蓝牙传感应用(转)
  10. 代理模式(Proxy)
  11. Android ListView与RecycleView的对比使用
  12. ubuntu12.04 安装中文输入法
  13. tomcat安装自制作ssl证书
  14. Flask 扩展 表单
  15. 连接MySQL常用工具
  16. Confluence 6 home 目录
  17. Python基础(十) __init__与__new__区别
  18. kmp--看毛片算法
  19. 设置cxGrid中RichEdit输入内容的格式
  20. C/C++语言中闭包的探究及比较

热门文章

  1. Redis的六种特性 场景
  2. 一个简单但能考察C语言基础的题目
  3. 全网最详细的ReentrantReadWriteLock源码剖析(万字长文)
  4. nodeJs-Stream接口
  5. AFNetworking 网络错误提示data转换字符串
  6. Java Jar包压缩、解压使用
  7. GO类型转换
  8. oracle体系结构(图)
  9. 【Linux】【Services】【KVM】安装与简单配置
  10. Mysql配置 主从同步