- 博客(11)
- 收藏
- 关注
原创 leetcode热题HoT 100
4. 寻找两个正序数组的中位数 思路 /* 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较 * 这里的 "/" 表示整除 * nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个 * nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个 * 取 pivot = min(pivot1,
2022-03-03 13:19:33
567
原创 与单调栈相关的算法题
1. 每日温度 1.1 思路 使用一个从栈底到栈顶单调递减的栈,栈内存放着温度对应的索引。 每一个元素与栈顶元素比较,如果比栈顶元素小直接入栈。 如果比栈顶元素大,则需要该元素减去栈顶元素即为所求元素,并存放在栈顶元素指向的对应的位置 1.2 代码 class Solution { public: vector<int> dailyTemperatures(vector<int>& temperatures) { stack<int
2022-01-27 19:51:55
495
原创 与动态规划有关的算法题
动态规划解题步骤 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组 1. 爬楼梯 1.1 思路 直接从结果上想问题! 他要的是由多少种走法,所以dp[i] 表示爬到第i层楼梯有多少种走法。 所以dp[i] = dp[i - 1] + dp[i - 2];因为从第i - 1层走一步,或者从第i - 2走两步就能到。 所以从前往后遍历即可。 1.2 代码 class Solution { public: int c
2022-01-26 12:16:37
324
原创 与贪心有关的算法题
贪心算法 贪心的本质是选择每一阶段的局部最优,进而得到全局最优。没有固定的套路,需要自行判断题目是否能用贪心来做。 1. 摆动序列 1.1 思路 思路1:贪心:从前往后,不断找到峰值,即极大值和极小值,通过统计极大值和极小值的数量来得到结果,思路比较简单 1.2 代码 class Solution { public: int wiggleMaxLength(vector<int>& nums) { if(nums.size() <= 1){
2022-01-18 20:12:35
288
原创 与回溯相关的算法题
回溯的基本模板: void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { //横向遍历 处理节点; backtracking(路径,选择列表); // 递归 纵向遍历 回溯,撤销处理结果 } } 1. 电话号码的字母组合 1.1 思路 本题采用回溯的思想,因为需要通
2022-01-12 21:28:09
338
原创 与二叉树相关的算法题
1. 二叉树的遍历 1.1 思路 递归应该如何写? 1、确定递归的参数和返回值 2、确定终止条件 3、确定单层递归逻辑 迭代应该如何写? 前序遍历为例,应先将根节点入栈,进入循环,一次从栈中弹出一个节点,读出节点值,再将右子节点、左子节点分别入栈。直至节点栈为空 中序遍历和前序遍历的情况不一样,中序遍历访问节点和处理节点的顺序是不一致的,访问到父节点需要将其存入栈中,直到访问到最左边的节点才能开始处理节点。中序遍历的思路:每次先找到该节点的最左边的子孙节点,访问完子孙节点,开始出栈,处理节点
2022-01-10 10:07:29
324
原创 与栈/队列相关的算法题
1. 滑动窗口最大值 1.1 思路 1、使用暴力方法解决,两层循环,时间复杂度O(N*M) 2、使用单调队列来解决: 单调队列是一个从大到小的队列,队列内存放的是可能是窗口内的最大元素。单调栈的细节如图: 单调队列的操作: (1)push(x) :x需要与队列入口的值进行比较,如果x小于等于队列入口值,则直接插入,如果x大,则队列尾部弹出,重新比较,直到队列中没有元素,或者x小于等于队列入口值。 (2)pop() :如果窗口弹出的值和队列出口处的值一致,则弹出队列出口值,否则不变。 1.
2021-12-29 10:14:19
455
原创 与字符串有关的算法题
1. 替换空格 1.1 思路 1、使用函数库中自带的replace函数和insert函数,但会超过其时间限制 2、使用双指针,先扩充数组,预留出需要新增的位置,之后从后往前扩充,直到两指针相遇。 1.2 代码 class Solution { public: string replaceSpace(string s) { //首先判断需要扩充多大位置 int count = 0; for(int i = 0; i < s.size()
2021-12-24 19:11:06
475
原创 与hash表相关的算法题
1. 有效的字母异位词 1.1 思路 核心思想是使用一个数组构成的hash来存储单词出现的次数,使用字符ch-’a‘得到数组的索引。 1.2 代码 class Solution { public: bool isAnagram(string s, string t) { int record[26] = {0}; for (int i = 0; i < s.size(); i++) { // 并不需要记住字符a的ASCII,只.
2021-12-23 18:00:14
395
原创 与链表相关的算法题
1. 设计链表 1.1 思路 主要注意:1、链表节点的定义;2、边界条件的判定;3、C++类的定义方式 1.2 代码 class MyLinkedList { private: struct ListNode{ int val; ListNode *next; ListNode(int val): val(val), next(nullptr){}; //注意链表节点的初始化方法 }; int _size; ListN
2021-12-22 18:56:54
881
原创 与数组相关的算法题
一维数组空间是连续的,二维地址空间是多个连续的地址空间组成。因为其连续性,导致其不能随便删除元素,只能覆盖。数组类型的题目多出二分查找,双指针,滑动窗口,模拟行为等。 1. 二分查找 1.1 思路 二分查找关键点在于对于区间的定义。主要有两种方式:左闭右闭、左闭右开。 在刷题过程中默认使用左闭右闭的方式,在这个过程中需要注意两点: right = nums.size() - 1 if(nums[middle] > target){ ri.
2021-12-21 18:22:49
305
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅