![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法笔记
Coding_Physical
一个拥有六块腹肌的IT男
展开
-
题目:找出两个 UIView 的最近的公共 View,如果不存在,则输出 nil 。
- (NSArray *)superCalsses:(UIView *)class{ if (!class) { return @[]; } NSMutableArray * result = [NSMutableArray array]; while (class) { [result addObject:class]; class = [class superview]; } .原创 2021-06-17 14:58:08 · 481 阅读 · 0 评论 -
判断T是否是S的子树
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} *.原创 2021-06-09 23:34:21 · 93 阅读 · 0 评论 -
二分排序算法模板
lowerBound,可以用来顺便解决掉 binarySearch;int lowerBound(long[] A, int n, long target) { int l = 0, r = n; while (l < r) { final int m = l + ((r - l) >> 1); if (A[m] < target) { l = m + 1; } else { r = m; }原创 2021-04-18 11:10:00 · 124 阅读 · 0 评论 -
算法学习--合并排序
class Solution { void msort(vector<int>& a, int b, int e, vector<int>&t){ // 空区间 或 只有一个元素 // 为了防止b + 1溢出,这里用b >= e先判断一下 if (b >=e || b +1 ==e) { return; } // 分成两半, 二叉树可.转载 2021-04-17 16:31:45 · 92 阅读 · 0 评论 -
并查集
【题目】园区里面有很多大楼,编号从 1~N。第 i 大楼可以自己花钱买路由器上网,费用为 cost[i-1],也可以从别的大楼拉一根网线来上网,比如大楼 a 和大楼 b 之间拉网线的费用为 c,表示为一条边 [a, b, c]。输入为每个大楼自己买路由器和拉网线的费用,请问,让所有大楼都能够上网的最小费用是多少?上网具有联通性,只要与能够上网的大楼连通,即可上网。输入:cost = [1, 2, 3], edges = [[1,2,100], [2,3,3]]输出:6class UF .原创 2021-04-03 20:59:56 · 95 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
int postOrder(TreeNode* root, TreeNode* p, TreeNode* q, TreeNode *&ans){ if (!root) { return 0; } // 查看子结点的梳计个数 int lcnt = postOrder(root->left, p, q, ans); int rcnt = postOrder(root->.原创 2021-03-28 20:55:15 · 70 阅读 · 0 评论 -
145. 二叉树的后序遍历
001 递归class Solution {public: vector<int> postorderTraversal(TreeNode* root) { vector<int>res; helper(root,res); return res; } void helper(TreeNode * root, vector<int>&res){ if(!root) r原创 2021-03-28 18:15:34 · 71 阅读 · 0 评论 -
450.删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为O(h),h 为树的高度。TreeNode *deleteNode(TreeNode *root, int key){ //如果root为空 if (!root) { ...原创 2021-03-27 23:55:02 · 78 阅读 · 0 评论 -
501. 二叉搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树官方解答:我们可以顺序扫描中序遍历序列,用 base 记录当前的数字,用count 记录当前数字重复的次数,用 maxCount 来维护已经扫描过的数当中出现最多的那个数字的出现次数,用 answer 数组记录出现的众数。每次扫描到一个新的元素:首先.原创 2021-03-27 21:39:50 · 103 阅读 · 0 评论 -
94. 二叉树的中序遍历
001 递归调用class Solution {public: void inOrder(TreeNode* root, vector<int>&ans){ if (root) { inOrder(root->left,ans); ans.push_back(root->val); inOrder(root->right,ans); } }原创 2021-03-27 17:48:13 · 66 阅读 · 0 评论 -
113. 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。class Solution { void backtrace(TreeNode *root, int64_t T, int64_t sum, vector<int> &path, vector<vector<int>> &ans){ if (!原创 2021-03-27 17:33:50 · 69 阅读 · 0 评论 -
572. 另一个树的子树
两个树的节点对应的值一样,要满足刚好两棵树是一样的,或者一棵是另一棵的左子树,或者一棵是另一棵的右子树如果s树都没找到t那就是不满足条件class Solution { bool isSameTree(TreeNode* p, TreeNode* q) { if(!p && !q) return true; if (!p || !q) return false; retu原创 2021-03-27 16:58:19 · 70 阅读 · 0 评论 -
100.相同的树
两棵树的每个节点的值相等,且他们的左子树和右子树也一样满足这个条件 bool isSameTree(TreeNode* p, TreeNode* q) { if(!p && !q) return true; if (!p || !q) return false; return p->val == q->val && isSameTree(p->lef原创 2021-03-27 16:19:32 · 63 阅读 · 0 评论 -
98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。利用“影子”二叉树bool isValidBST(TreeNode* root) { //“影子”二叉树 利用栈 每个节点对应一个范围 stack<pair<TreeNode *, pair<int64_t, int64_t>>.原创 2021-03-27 15:59:29 · 101 阅读 · 0 评论 -
144. 二叉树的前序遍历
给你二叉树的根节点root,返回它节点值的前序遍历。001 解法一 递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) :...原创 2021-03-26 11:49:57 · 78 阅读 · 0 评论 -
141. 环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lin原创 2021-03-23 11:54:14 · 60 阅读 · 0 评论 -
143. 重排链表
链表分成两部分,后一部分翻转,依次加入新的链表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *原创 2021-03-23 11:31:15 · 92 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
关键词 双指针/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x),原创 2021-03-23 10:22:30 · 74 阅读 · 0 评论 -
24.两两交换链表中的节点
ListNode *merge(ListNode *odd, ListNode *even){ ListNode dummy, *tail = &dummy; bool isEven = true; while (odd || even) { //奇数链表为空 或者 偶数标记 偶数链表不为空 那就在尾部添加偶数结点 if (!odd || isEve.原创 2021-03-22 23:47:12 · 84 阅读 · 0 评论 -
21. 合并两个有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2){ //首先生成空链表 ListNode dummy; ListNode* tail = &dummy; //遍历两个有序链表,每次只取一个结点append到新链表里面 while (l1 || l2) { //如果l2链表为空,或者l...原创 2021-03-22 23:29:44 · 202 阅读 · 0 评论 -
203. 移除链表元素
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点。ListNode* removeElements(ListNode* head, int val) { //新建一个链表 ListNode dummy, *tail = &dummy; auto p = head; //开始遍历 while (p) { ...原创 2021-03-22 22:41:14 · 108 阅读 · 0 评论 -
206. 反转链表
插入头部结点 代码为p->next = dummy;dummy=p;001建立一个新的带假头的空链表002遍历旧链表,依次取出旧链表中的每个结点003采用头部插入的方法放到新链表中;004返回 dummy代码ListNode* reverseList(ListNode* head) { ListNode* dummy = nullptr; auto p = head; while (p) { ...原创 2021-03-22 08:39:32 · 80 阅读 · 0 评论 -
学习链表基础知识
001 初始化struct ListNode{ int val = 0; ListNode *next = nullptr; ListNode(){} ListNode(int x){val = x;} }; ListNode dummy; ListNode* tail = nullptr; int length = 0;新建一个dummy头,tail结点指向dummy;原创 2021-03-21 22:32:33 · 136 阅读 · 0 评论 -
295. 数据流的中位数
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4]的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-median-f.原创 2021-03-20 23:53:04 · 85 阅读 · 0 评论 -
743. 网络延迟时间
/* * @lc app=leetcode.cn id=743 lang=cpp * * [743] 网络延迟时间 * * https://leetcode-cn.com/problems/network-delay-time/description/ * * algorithms * Medium (46.62%) * Likes: 230 * Dislikes: 0...原创 2021-03-20 23:39:01 · 135 阅读 · 0 评论 -
871. 最低加油次数
class Solution {public: int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) { const size_t N = stations.size(); // 出发地是从0位置开始出发 int curPos = 0; //用来存放汽油的队列 .原创 2021-03-20 23:02:56 · 84 阅读 · 0 评论 -
1705. 吃苹果的最大数目
class Solution {public: int eatenApples(vector<int>& apples, vector<int>& days) { const size_t N = apples.size(); auto cmp = [&](const pair<int, int>&a, const pair<int, int>& b){ .原创 2021-03-20 22:15:35 · 132 阅读 · 0 评论 -
1642. 可以到达的最远建筑
class Solution {public: int furthestBuilding(vector<int>& heights, int bricks, int ladders) { if (heights.empty()) { return -1; } priority_queue<int> Q; int qSum = 0; .原创 2021-03-20 21:18:39 · 90 阅读 · 0 评论 -
堆数据结构(C++版)
class Heap { public: vector<int> a; int n =0; //下沉 void sink(int i){ int j =0; int t = a[0]; //找到i结点的左子节点 while ((j=(i<<1) +1)<n) { /* j < n-1 判断是否有右子节点 .原创 2021-03-15 16:17:23 · 92 阅读 · 0 评论 -
基于GIT代码版本控制
转载 2021-03-15 14:19:09 · 75 阅读 · 0 评论 -
队列之 二叉树的层平均值
题目:给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:原创 2021-03-08 18:16:07 · 78 阅读 · 0 评论 -
队列之二叉树的层序遍历
vector<vector<int>> levelOrder(TreeNode *root){ vector<vector<int>> ans; queue<TreeNode *> Q; if (root) { Q.push(root); } while (!Q.empty()) { //获取队列长度 层数 size_t.原创 2021-03-08 17:14:35 · 288 阅读 · 0 评论 -
找出数组中右边比我小的元素
关键词:单调栈【题目】一个整数数组 A,找到每个元素:右边第一个比我小的下标位置,没有则用 -1 表示。输入:[5, 2]输出:[1, -1]解法:class Solution { vector<int> findRightSmall(vector<int> &A) { if (A.empty()) { return {}; } // 结果数组 vector<int> ans(A.size()); //.原创 2021-03-06 23:20:48 · 721 阅读 · 0 评论 -
有效的括号
关键词 栈 先进后出数据结构001 只有一种括号解法 // 当字符串本来就是空的时候,我们可以快速返回true if (s.empty()) { return true; } // 当字符串长度为奇数的时候,不可能是一个有效的合法字符串 if (s.length() % 2 == 1) { return false; } // 消除法的主要核心逻辑: stack<char> t; for (原创 2021-03-06 23:02:46 · 79 阅读 · 0 评论 -
Leetcode 70. 爬楼梯
题目:假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。算法一:利用动态规划 dp[i] = dp[i-1]+dp[i-2];表示走到第i位台阶可以有两种走法:走一个台阶和走两个台阶 时间复杂度和空间复杂度O(n)class Solution {public: int climbStairs(int n) { if(n ==1) return 1; ...原创 2020-11-10 22:53:51 · 62 阅读 · 0 评论 -
468. 验证IP地址
编写一个函数来验证输入的字符串是否是有效的 IPv4 或IPv6 地址。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。IPv4地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为0 -255,用(".")分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址172.16.254.01 是不合法的。IPv6地址由...原创 2020-11-04 16:58:13 · 64 阅读 · 0 评论 -
LeetCode 4 sum 解法
题目连接:https://leetcode-cn.com/problems/4sum/解题思路此处撰写解题思路第一层循环 从0-->n-3去掉重复if(i>0 && nums[i]==nums[i-1])continue;如果当前元素和后三个元素之和大于target直接breakif(nums[i]+nums[i+1]+nums[i+2]+nums[i+...原创 2020-03-05 23:54:17 · 197 阅读 · 0 评论