
算法技巧
文章平均质量分 91
小可爱amour
magic_coder_sun,一个可爱的小绿博主
展开
-
整体把握七大排序,就靠它了
目录notice:冒泡排序工作原理实现思想动图视频伪代码特点插入排序工作原理实现思想动图视频伪代码特点归并排序工作原理实现思想动图视频伪代码特点选择排序工作原理实现思想细节动图视频伪代码特点希尔排序工作原理实现思想细节特点堆排序工作原理实现思想C++代码特点快速排序工作原理实现思想细节动图视频伪代码特点总结noti...原创 2021-04-01 21:51:02 · 488 阅读 · 1 评论 -
剑指面试题29. 顺时针打印矩阵 (算法解析和代码讲解)
1:算法解析 算法如图,从矩阵的(0,0)开始,向右至此行最右边有效的节点,则向右处理行(最小行)结束; 从下一行的列节点开始,向下至此列最下边有效的节点,则向下处理列(最大列)结束; 从此行的左边节点开始,向左至此行最左边有效的节点,则向左处理行(最大行)结束; 从上一行的行节点开始,向上至此列最上边有效的节点,则向上处理...原创 2020-06-12 21:19:28 · 145 阅读 · 0 评论 -
剑指面试题30. 包含min函数的栈 (构造数据结构和每次压栈两次两种解法)
解法1:构造合适的数据结构 根据题意,构造合适的数据结构,一个Data是一个栈元素,其中val是当前栈的数值元素,prim_min记录的是当前栈之前所有数值元素的最小值,若需要知道当前元素的最小值,只需要求得min(val, prim_min)即可。 构造数据结构时,用时需要仔细区分->和.来正确访问元素。#define N 10000#define Min(x,y) ((x)<(y)?(x):(y))typedef struct { ...原创 2020-06-15 12:42:17 · 99 阅读 · 0 评论 -
剑指面试题52. 两个链表的第一个公共节点 (先长后短和命中注定相遇两种解法)
解法1:长链表先走,然后齐头并进struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { if (headA == NULL || headB == NULL) return NULL; int lenA = countLen(headA), lenB = countLen(headB); struct ListNode *aPtr =原创 2020-06-16 19:09:12 · 408 阅读 · 0 评论 -
剑指面试题32. 从上到下打印二叉树系列 (算法详细图解和STL队列/双向队列实现)
题目1:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。1.1 思路解析 为了更好地讲解从上到下打印二叉树系列的题目,我们所选的二叉树示例如图1所示。 图1:二叉树示例 根据题意,我们需要一个一边压入节点一边输出节点的容器,也就是可以选择队列或者双向队列。这里...原创 2020-06-18 18:18:51 · 212 阅读 · 0 评论 -
114. 二叉树展开为链表 (四种解法)
解法1:递归,从下至上先将深层次的左右子树转化为链表关键步骤:1:对带有左子树的节点,将其左右子树展开为链表。2:找左子树最右的叶子节点,将右子树挂左子树最右叶子上。3:将左子树换成右子树,左子树置空。class Solution {public: void flatten(TreeNode* root) { if (NULL == root) return; flatten(root->righ原创 2020-07-01 18:17:05 · 289 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针 (三种实现及讲解)
题目:给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。题目链接解法1:从上至下打印二叉树的思路,一层层完成连接class .原创 2020-07-01 22:34:15 · 323 阅读 · 0 评论 -
121/122. 买卖股票的最佳时机 I/II (多种解法)
121. 买卖股票的最佳时机题目:给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。解法:class Solution {public: int maxProfit(vector<int>& prices) { int len = prices.size(); if (len .原创 2020-07-02 18:26:42 · 147 阅读 · 0 评论 -
141. 环形链表 142. 环形链表 II (数学分析)
141. 环形链表题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。解法:快慢指针class Solution {public: bool hasCycle(ListNode *head) { if (NULL == head) return false; ListNo.原创 2020-07-03 12:21:51 · 2698 阅读 · 0 评论 -
144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历(多种解法的进阶)
144. 二叉树的前序遍历题目:给定一个二叉树,返回它的前序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]解法1:递归class Solution {private: void takeVal(TreeNode *root, vector<int>& res) { if (NULL == root) return;..原创 2020-07-03 18:39:50 · 3603 阅读 · 0 评论 -
1. 两数之和 15. 三数之和 18. 四数之和 16. 最接近的三数之和 (解法的共性和差异)
1. 两数之和题目:给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。题目要点:1:数组无序。2:因为是返回数的下标,排序再用双指针需要额外维护数的原索引。解法1:穷遍历class Solution {public: vector<int> twoSum(vector<int>& nums...原创 2020-07-07 19:27:37 · 272 阅读 · 0 评论 -
21. 合并两个有序链表 23. 合并K个排序链表(递归和迭代) 14. 最长公共前缀(四种思路解析)
21. 合并两个有序链表题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解法:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), n..原创 2020-07-08 19:16:04 · 142 阅读 · 0 评论 -
268. 缺失数字 (求和/异或/哈希/排序)
题目描述给定一个包含0, 1, 2, ..., n中n个数的序列,找出 0 ..n中没有出现在序列中的那个数。示例 1:输入: [3,0,1]输出: 2示例2:输入: [9,6,4,2,3,5,7,0,1]输出: 8解法1:求和,线性复杂度/常数空间,注意溢出class Solution {public: int missingNumber(vector<int>& nums) { int len = n...原创 2020-08-31 16:43:42 · 164 阅读 · 0 评论