随笔分类 -  数据结构与算法

插入排序
摘要:原数组为915623 1 void print(vector<int>& a, int n, int i) { 2 cout << "step" << i << ": "; 3 for (int j = 0; j < n; j++) { 4 cout << a[j] << " "; 5 } 6 co 阅读全文
posted @ 2023-10-13 11:04 小凉拖 阅读(15) 评论(0) 推荐(0)
选择排序
摘要:核心思想:以第k趟为例:将余下的元素最小者放在第k个位置,如果这个最小者原本不在第k个位置则需要和第k个位置上的元素交换 1 void selectSort(vector<int>& nums) { 2 int len = nums.size(); 3 int minIndex = 0; 4 for 阅读全文
posted @ 2023-10-13 09:24 小凉拖 阅读(18) 评论(0) 推荐(0)
双指针
摘要:双指针问题要回答几个问题 要不要将数组排序 两个指针是有共同的起点还是两个指针一个在左一个在右(也就是所谓的对撞指针) i什么时候走,j什么时候走,i走不走是否受到j的影响 三数之和 https://leetcode.cn/problems/3sum/?envType=study-plan-v2&e 阅读全文
posted @ 2023-10-02 23:11 小凉拖 阅读(17) 评论(0) 推荐(0)
哈希表力扣题总结
摘要:经验1 unordered_map/map容器: 两数和:https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked 字符串异位词 https://leetcode.cn/pr 阅读全文
posted @ 2023-09-27 11:21 小凉拖 阅读(29) 评论(0) 推荐(0)
哈希表概念
摘要:何时使用哈希表 当判断某一集合中是否出现过某一元素的时候以以下两个力扣题为例:它们都是判断某一数组中是否有一定关系的两个或多个元素,首先 两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。根据这个关系找到一个标志,使用哈希表存储每一组字母异位词,哈希表的键为标志。比如说两数和,7就作为标志 阅读全文
posted @ 2023-09-22 21:15 小凉拖 阅读(28) 评论(0) 推荐(0)
快指针慢指针
摘要:快指针和慢指针主要解决将某一目标值覆盖或抛到数组最后且不改变原数组剩下元素的顺序的问题 快指针每次循环都会往后移动,慢指针只有快指针没有遇到目标值的时候才会往后移动,在慢指针移动之前还要对目标值进行覆盖或则交换操作。 将目标值抛到最后 https://leetcode.cn/problems/mov 阅读全文
posted @ 2023-09-22 15:32 小凉拖 阅读(31) 评论(0) 推荐(1)
防止数组下标越界的方法
摘要:防止数组下标越界的方法是:先判断指针的位置是否在界外,然后再取指针位置的元素 常常犯的错误是while(nums[j]==0&&j!=nums.size()) 一定要将判断是否是界外放在判断数组的元素前面while(j!=nums.size()&&nums[j]==0) 力扣下标越界会报如下错误 阅读全文
posted @ 2023-09-22 15:26 小凉拖 阅读(145) 评论(0) 推荐(0)
快速排序
摘要:在从小往大排的前提下,如果以左边为基数的话必须在比左边小的地方让两个指针相遇,因为在相遇时必须将相遇时候的数和基数交换,将相遇的数放在基数的位置,也就是小于基数的区域。 因此如果以左边为基数的话必须右指针先动,如果以右边为基数的话必须左指针先动。 图解快速排序(C++实现)_快速排序c++实现_Ma 阅读全文
posted @ 2023-09-02 22:38 小凉拖 阅读(15) 评论(0) 推荐(0)
(根据二叉树总结)递归条款1~程序和递归函数的位置关系
摘要:2全局变量的作用 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 以二叉树最小绝对值差为例: 如果将pre=cur;这句话写在所有递归函数之前(一般终止条件为第一行代码)作用不大 1 class Solution { 阅读全文
posted @ 2023-08-31 08:46 小凉拖 阅读(24) 评论(0) 推荐(0)
二叉搜索树的公共祖先
摘要:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 1 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { 2 if(root==nullptr||root==p||root==q)retur 阅读全文
posted @ 2023-08-25 20:17 小凉拖 阅读(10) 评论(0) 推荐(0)
二叉树的最近公共祖先
摘要:235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 经验1: 在二叉树中找满足条件的结点的问题一般使用后续遍历,也就是说如果找到了这个结点那么就将它返回给上层,然后层层返回最终返回到根结点 经验2:本题的解题技巧:如果在某一结点找到了p或q,那么就不用往下递归了,直接将这个结点返回,即 阅读全文
posted @ 2023-08-23 23:17 小凉拖 阅读(19) 评论(0) 推荐(0)
验证二叉搜索树
摘要:98. 验证二叉搜索树 - 力扣(LeetCode) 二叉搜索树: 根节点的左子树的所有元素的值都小于根节点,根节点右子树的所有元素都大于根节点的值。 使用中序遍历的序列一定是一个递增的序列,因此一个二叉树如果中序遍历之后得到的是一个递增序列那么它一定是二叉搜索树。 阅读全文
posted @ 2023-08-20 22:19 小凉拖 阅读(15) 评论(0) 推荐(0)
二叉搜索树中的搜索
摘要:700. 二叉搜索树中的搜索 - 力扣(LeetCode) 经验1: 情况要考虑周全,开始只想到了找到的情况,而没有去想没找到的情况,漏掉了if(root==nullptr) return root; 经验2: 如果该层想要下一层的返回结果,则在该层定义一个返回值类型的变量,然后在该层接递归的返回值 阅读全文
posted @ 2023-08-20 21:02 小凉拖 阅读(9) 评论(0) 推荐(0)
合并二叉树
摘要:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 经验1: 程序写在递归函数前面代表压栈的时候实现,也就是说浏览到这个结点的时候实现 程序写在递归函数后面代表弹栈的时候实现,也就是下一次递归结束后在本次递归函数中实现 (补充:删掉递归部分剩下所有的程序都是本层的程序) 那么到底是压栈的时 阅读全文
posted @ 2023-08-19 09:31 小凉拖 阅读(14) 评论(0) 推荐(0)
平衡二叉树
摘要:110. 平衡二叉树 - 力扣(LeetCode) 确定思路 如果左右子树都是平衡二叉树,并且左右子树的高度相差不超过1,那么就是平衡二叉树,如果左子树不是平衡二叉树也就不用对右子树进行递归了 确定终止条件 应该是遍历到叶子节点,因为叶子节点不能构成二叉树了,因为就没有再往下遍历的必要了 ————— 阅读全文
posted @ 2023-08-17 22:11 小凉拖 阅读(39) 评论(0) 推荐(0)
二叉树的所有路径
摘要:257. 二叉树的所有路径 - 力扣(LeetCode) 经验1:终止条件的讨论 "if (root == nullptr)return;"的作用 首先写在主要函数中(也就是lecode所给的函数),作用是如果是一个空树传进了主要函数,那么我就让主要函数直接返回,就不要走算法函数了,也就是防空树的作 阅读全文
posted @ 2023-08-17 00:32 小凉拖 阅读(51) 评论(0) 推荐(0)
路径总和
摘要:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 经验1: 如果一段程序写在递归的上方,代表这一层函数压栈时(也就是这层递归开始运行时)运行这段程序 int fun(int n) { static int i = 0; if (n == 1) return 1; if (n == 4) 阅读全文
posted @ 2023-08-16 09:23 小凉拖 阅读(23) 评论(0) 推荐(0)
二叉树的层序遍历
摘要:int findBottomLeftValue(TreeNode* root) { queue<TreeNode*>qu; if(root!=nullptr) qu.push(root); int size=0; int result=0; while(!qu.empty()){ TreeNode* 阅读全文
posted @ 2023-08-13 20:50 小凉拖 阅读(15) 评论(0) 推荐(0)
递归的进一步思考
摘要:翻转二叉树: 首先要想整体思路: 翻转一个二叉树就是先将左子树和右子树翻转,然后对作用左子树翻转函数(对左子树中的所有左右结点翻转),对右子树进行翻转函数 那么递归部分如下: swap(node->left ,node->right); reverse(node->left); reverse(no 阅读全文
posted @ 2023-08-11 23:25 小凉拖 阅读(19) 评论(0) 推荐(0)
左叶子节点之和
摘要:首先将非终止条件,非递归函数部分叫做单层递归。 思考过程如下: 首先想总的思路:就是找到左子树的左叶子节点将它的值加到sum上,然后找到右子树的左叶子结点将它的值加到sum上,最后将它们的值相加就是左叶子结点之和,由此我们可以写出递归部分 1 leftsum(node->left, sum); 2 阅读全文
posted @ 2023-08-10 23:13 小凉拖 阅读(35) 评论(0) 推荐(0)