单调栈的概念单调栈指的是维护一个栈,栈内的元素从栈顶到栈底维持递增或者递减的顺序。 以递增栈为例,看看单调栈的维护过程————当遍历元素小于栈顶元素时,此时没有破坏单调栈的单调递增关系,将遍历元素入栈(有时候等于也要入栈,看解题的具体需要);当遍历元素大于栈顶元素时,此时破坏了单调栈的单调递增关系,就需要进行一系列的操作(可能是记录答案),将栈顶元素出栈,继续将遍历元素与栈顶元素比较,直到小于(等
回溯回溯就是暴力枚举,最多再做点剪枝。 回溯的递归韩式有个模板,一般无返回值代表搜索所有结果 123456789101112void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
排序1.快速排序前后法h版思路首先确定排序结束条件,然后设置左右指针和基准值,开始一趟排序使得以基准值为中心,左小右大,最后对左右分区继续进行排序。 快速排序的核心在于一趟排序该怎么写。左指针去找左边大于基准值的元素,右指针去找右边小于基准值的元素,然后交换左右指针的值。当左右指针相遇时,一趟循环就结束了,此时交换基准值和指针相遇处的元素。 启动顺序主打一个反着启动! 注意!左右指针的启动顺序取决
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick
因为有负有正,所以不能简单地使用一个dp记录。负数最小乘以负数可能会变最大,正数最大乘以负数可能会变最小。因此还需要记录乘积最小的情况,用于不断更新。 定义状态maxF[i],表示以i结尾的子数组的最大乘积;定义状态minF[i],表示表示以i结尾的子数组的最小乘积。 考虑状态转移,maxF[i]可有nums[i]加入maxF或minF转移形成,也有可能由nums[i]转移形成;minF[i]可有
代码随想录-数组
1.基础知识数组的内存分配理论上是连续的,需要特别注意的是别越界就好了。 2.二分查找力扣题目链接 基础写法思路:参考 CSDN二分查找)或代码随想录二分查找,写法比较简单,也已经比较熟悉了,只要注意区间定义的不变,就能解决问题。有递归和非递归两种写法,注意非递归有“左闭右闭”和“左闭右开”两种写法。 123456789101112131415161718192021222324252627282
LeetCode临时整理
LeetCode刷题记录记录模板解法xxx:xxx 思路 犯错 代码 0001 两数之和O(n)思路:使用哈希表记录原数和原数的下标,扫描一遍,去哈希表中寻找另一半数,找不到就记录原数和原数的下标,找到据返回。错误:忽略了map查找有两个返回值的特点,返回值可以更简洁,不一定要设计变量记录 12345678910func twoSum(nums []int, target int) []int
动态规划总结
动态规划问题介绍大致做法:大问题分解为小问题,存储子问题的解避免重复计算。 最优子结构:原问题的最优解是从子问题的最优解构造来的 重叠子问题:相同的问题会被多次计算 无后效性:问题的当前状态的最优解不受其未来状态的影响 存储子问题的解:通常使用表格(数组或者哈希表)来存储子问题的解 计算顺序:子问题间存在依赖性,要保证计算一个子问题前,其依赖的所有子问题已经解决 代码实际概念状态:子问题的定义,通