当前位置:网站首页>break algorithm---刷题map

break algorithm---刷题map

2022-07-07 23:26:00 killingwill




资源参考:
LeetCode
中文版:https://leetcode-cn.com/problemset/all/
英文版:https://leetcode.com/problemset/all/

相关代码实现 – python语言:
https://github.com/muxintong/break-algorithm/

LeetCode题解总结
https://github.com/labuladong/fucking-algorithm
https://labuladong.gitee.io/algo/
https://grandyang.com/leetcode/1147/

Python3文档
https://docs.python.org/3/

数据结构
https://www.runoob.com/data-structures/
Problem Solving with Algorithms and Data Structures using Python
https://runestone.academy/runestone/books/published/pythonds/index.html




一.单调栈

二.并查集

三.滑动窗口

四.前缀和 & HASH

五.差分

六.拓扑排序

七.字符串

八.BFS

九.DFS

十.动态规划

十一.贪心算法

十二.字典树















一.单调栈

1.1 单调栈介绍

单调栈:

  1. 定义:栈内元素单调递增或者单调递减的栈,单调栈只能在栈顶操作。
    单调栈 = 单调 + 栈,因此其同时满足两个特性: 单调性、栈的特点。
    单调性: 单调栈里面所存放的数据是有序的(单调递增或递减)。
    栈: 后进先出。
  2. 实现:单调栈里的元素具有单调性,元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除。
    单调递减栈:找到从左起第一个比当前元素大的元素
	stack<int> st;
	for (遍历这个数组)
	{
    
		if (栈空 || 栈顶元素大于等于当前比较元素)
		{
    
			入栈;
		}
		else
		{
    
			while (栈不为空 && 栈顶元素小于当前元素)
			{
    
				栈顶元素出栈;
				更新结果;
			}
			当前数据入栈;
		}
	}

上述代码优化合并:

stack<int> st;
for(遍历数组){
    
	while(当前元素 > 栈顶元素 && 栈非空){
    
		弹栈;//catch it!找到了从左起第一个比当前元素大的元素!
		更新结果集;
	}
	当前元素入栈;
}

单调递增栈:找到从左起第一个比当前元素小的元素

stack<int> st;
for(int i=0; i<arr.length; i++){
    
	while(当前元素 < 栈顶元素 && 栈非空){
    
		弹栈;//catch it!找到了从左起第一个比当前元素小的元素!
		更新结果集;
	}
	当前元素入栈;
}
  1. 时间复杂度:O(n)
    线性,每个元素遍历一次。
    因其满足单调性和每个数字只会入栈一次,并且出栈后再也不会进栈了,所以可以在时间复杂度 O(n) 的情况下解决一些问题。
  2. 应用:
    - 单调递增栈可以找到左起第一个比当前数字小的元素
    - 单调递减栈可以找到左起第一个比当前数字大的元素
原网站

版权声明
本文为[killingwill]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_41875506/article/details/119384666