![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm
风尘仆
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 32 - 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树/** * 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: vec.原创 2020-09-30 09:13:24 · 90 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof著作权归领扣网络所有...原创 2020-09-06 23:40:43 · 66 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]思路分析:1.递归方法。遍历至最后一个节点时打印输出,从调用栈底部回去的时候打印上层的节点值。2.借助辅助栈。正序遍历链表,遍历过程中保存元素至一个辅助栈中。遍历完毕再一次弹出栈中元素并打印。...原创 2020-09-01 22:17:38 · 63 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-s...原创 2020-08-04 10:45:32 · 116 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树:root =[3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解...原创 2020-07-01 00:53:00 · 95 阅读 · 0 评论 -
剑指offer-面试题57 - II. 和为s的连续正数序列
题目描述:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]限制:1 <= target <= 10^5来源:力扣(LeetCode)链接:https://leetco...原创 2020-06-11 21:18:11 · 172 阅读 · 0 评论 -
剑指offer-面试题57. 和为s的两个数字
题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10] 限制:1 <= nums.length <= 10^51 <= num原创 2020-06-09 22:52:07 · 97 阅读 · 0 评论 -
剑指offer第56题
题目描述:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1限制:1 <= nums.length <= 100001 <= nums[i] < 2^31来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sh...原创 2020-06-07 16:19:56 · 109 阅读 · 0 评论 -
Leetcode 19. Remove Nth Node From End of List
第一次做这道题的时候使用的方法是先扫描链表一次统计其长度len,再使用一个指针遍历链表,从头节点向后走len-n-1步,只想待删除节点的前一个节点再做处理。遇到待删除节点为头节点的情况单独处理。第二次做这道题考虑最优算法。使用近扫描一次的算法——快慢指针的思想,快指针先走一些步数慢指针再开始走,他俩同时走时保持固定的距离。当快指针走到链表尾部的时候,慢指针恰好走到待删除节点的前原创 2017-04-18 20:40:12 · 432 阅读 · 0 评论 -
lletcode-236. Lowest Common Ancestor of a Binary Tree
解题思路:在根节点左右两侧寻找输入的两节点,一旦发现就返回其根节点的值.左右两子树返回均不空则表明根节点是要找的节点,只有一个不为空则表明待寻找的两子节点在一个根节点左边或右边的一侧.代码实现:class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr原创 2017-04-23 15:34:53 · 326 阅读 · 0 评论 -
leetcode-303. Range Sum Query - Immutable
解题思路:求解区间内元素的和。由于要多次查询,最朴素的方法是每次查询依次遍历集合中的所有元素并求和。但显然多次查询区间有交叉的话会重复计算某些新元素。由于区间是连续的,考虑保存中间的结果。下次查询就节省了很多重复计算。实现代码:class NumArray {public: vector arr; NumArray(vector nums) {原创 2017-05-19 22:01:15 · 305 阅读 · 0 评论 -
leetcode-64. Minimum Path Sum
解题思路:state:f[x][y]从起点走到x,y的最短路径function:f[x][y]=min(f[x][y-1],f[[x-1][y-1])+A[x][y]initialize:f[0][0] = A[0][0] //f[i][0] = sum(0,0 -> i,0) //f[0][i] = sum(0,0原创 2017-05-21 20:26:25 · 267 阅读 · 0 评论 -
leetcode-7. Reverse Integer
解题思路:先确定输入的符号,然后对其绝对值进行处理。用%10取余得到输入的最后一位同时构造他的镜像数。唯一需要注意的是int型的最大是2147483647,一旦发现镜像数已经大于214748364,就没必要再乘以10了。解题代码:class Solution {public: int reverse(int x) { if(x==0) ret原创 2017-06-07 01:05:27 · 219 阅读 · 0 评论 -
leetcode-9. Palindrome Number
解题思路:首先考虑把输入转化成字符串,使用俩指针相向而行判断是否有相交。但是题目建议不要使用这种方法。后来考虑对输入循环取余获得个位数的同时计算他的镜像(类似于二叉树镜像)。发现镜像接近于原输入就终止。最后判断两者是否相当。解体代码:class Solution {public: bool isPalindrome(int x) { if(x<0 ||原创 2017-06-07 01:13:06 · 216 阅读 · 0 评论 -
leetcode-11. Container With Most Water
解题思路:一种比较简单的思路就是使用两个指针,一个指针指向容器右边的位置,一个指针从最左边开始遍历,依此计算一个容积,并与历史的最大容积作比较。这样的时间复杂度是O(N^2)。还有一种思路是使用两个指针分别指向数组的最低和最高位置。先计算一个初始的容积,再比较左右的高度来移动两边的指针。题目要求容积最大,则应当使宽度或高度增加。因为初始宽度已经是最大了,只能增加高度了——即保持高指针不变,低指针向原创 2017-06-11 11:28:03 · 260 阅读 · 0 评论 -
leetcode-26. Remove Duplicates from Sorted Array
解题思路:首先考虑利用vector容器自身提供的erase方法。使用一个历史变量保存上一个浏览过的元素,当前访问元素与历史记录不同时向前移动指针否则删除指针。但这种方法效率较低。考虑换一种写法,可以不使用容器提供的方法,效率还可以更快。解题代码一:class Solution {public: int removeDuplicates(vector& nums原创 2017-06-12 22:54:39 · 233 阅读 · 0 评论 -
二叉树的几种遍历方法
树的遍历是指访问树的每个节点,且每个节点仅被访问一次。二叉树的遍历可按二叉树的构成以及访问结点的顺序分为4种方式,即先序遍历、中序遍历、后序遍历、层序遍历。前后中三种遍历的区别在于同一节点在不同时刻被访问,在其各自的遍历结果序列中位置不同。 一、先序遍历二叉树先序遍历非递归方法leetcode-114方法一:stack st;TreeNode *cur = root原创 2017-02-05 00:32:48 · 1069 阅读 · 0 评论 -
查找数组中的峰值
零、目标定义给定一个数组A,长度为n。查找峰值的下标 i,i 满足条件 A[i] > A[i-1] 并且 A[i] > A[i+1] 。对于数组边界处的元素,只要它满足大于等于其相邻元素亦可认为它是峰值。即A[-1] = A[n] = -inf。一、一维数组1.算法描述2.时间复杂度每次将问题规模减半。所以时间复杂度是O(logn翻译 2017-09-04 00:58:21 · 1800 阅读 · 0 评论 -
leetcode-112. Path Sum
思路:判断只有当前节点是叶子节点并且结点的值等于暂时sum的值时才确定这是一条满足要求的路径.拥有一条这样的路经就返回真,所以对左右子树的判断结果取活运算.class Solution {public: bool hasPathSum(TreeNode* root, int sum) { if(!root) return false原创 2017-03-17 09:35:24 · 442 阅读 · 0 评论 -
B树和B+树的区别
B-树 是一种多路搜索树(并不是二叉的),一颗m阶的B-树,或为空树,或者: 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3.除根结点以外的非叶子结点的儿子数为[M/2, M]; 4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)原创 2017-04-07 10:35:59 · 297 阅读 · 0 评论 -
Kruskal最小生成树算法代码实现(c++)
#include #include #include #include #include using namespace std;//union-find classclass UF{ private: vector id; vector sz; int count; public: UF(int N) { count = N; fo原创 2015-12-16 00:29:55 · 1062 阅读 · 0 评论 -
Leetcode_Easy_Medium题集
1. 292-Nim Game分别列举1-5个石头的胜负情况,一次是1,1,1,0,1。后面石头数再增加的话,问题可以转化为考虑自己可否在第一次拿去1-3个石头,从而使得另一个人第一次去拿石头面对不得不输的情况。规律是逢4的整数倍输一次,其他情况都可以通过最优策略转化为使得对方必输的情况。原创 2016-08-26 19:46:41 · 1015 阅读 · 0 评论 -
LeetCode-141. Linked List Cycle
思路:双指针法,设置快慢双指针。假如有环,快指针一定会和慢指针相遇。假如无环,快指针一定首先到达链表尾部。 bool hasCycle(ListNode *head) { ListNode *slow = head; ListNode *fast = head; while(fast !=NULL){ slo原创 2017-01-18 21:10:27 · 289 阅读 · 0 评论 -
LeetCode-2 && 445. Add Two Numbers I && II
解题思路:两链表中长度较长的一条作为存储结果的链表,假设第一条链表的长度较长。需要考虑链表长度不等的三种情况。其中第一条链表的长度小于第二条时,需要连接第一条链表和第二条链表多出来的尾巴,所以在进行后向遍历时需要有一个prev指针——同时这个prev指针在两链表长度一致时也可以保存多出来的进位(假如有的话)。class Solution {public: ListNode原创 2017-01-21 21:19:58 · 298 阅读 · 0 评论 -
LeetCode-148. Sort List
做题思路:先使用快慢指针确定链表的中间位置(注意慢指针的位置)。再对两个链表递归调用排序,最后再合并两个已排好序的单链表。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x)原创 2017-01-23 00:50:05 · 220 阅读 · 0 评论 -
Leetcode-86. Partition List
解题思路:使用两个节点保存切分后的俩链表。最后再合并到一起。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class S原创 2017-01-23 01:13:26 · 226 阅读 · 0 评论 -
Leetcode-23. Merge k Sorted Lists
解题思路:思路很简单。因为vector容器支持不停的取出和放回操作。所以可以每次取出两个链表,合并好之后再放回。当然,前提是vector中的元素数目多于1。元素数目等于一时即为所求的链表。不过这题的坑点是vector的访问与删除操作,见下面四种解法。方法一:Runtime: 243 ms ListNode* mergeKLists(vector& lists) {原创 2017-01-23 02:23:07 · 186 阅读 · 0 评论 -
Leetcode-61. Rotate List
解题思路:统计链表长度后,找到新链表首元素的位置。断开旧链表,链接新链表class Solution {public: ListNode* rotateRight(ListNode* head, int k) { if(head==NULL) return head; ListNode *left = head,*right =原创 2017-01-23 18:38:41 · 283 阅读 · 0 评论 -
Leetcode- 143. Reorder List
解题思路:使用快慢指针找到链表的中间位置(代码需要写的非常小心)。对于后半部分的链表逆序(如果不使用哑节点dummy方法,需要在之前判断链表元素个数小于1时直接返回。)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * L原创 2017-01-24 10:08:33 · 269 阅读 · 0 评论 -
Leetcode-138. Copy List with Random Pointer
解题思路一:使用hashmap保存原链表节点的地址,和新链表中对应节点地址。第一次对原链表进行遍历同时初始化新链表。第二次对原链表进行遍历,同时对新链表中节点的random指针进行赋值。时间复杂度为O(n),空间复杂度为O(n)。/** * Definition for singly-linked list with a random pointer. * struct Rando原创 2017-01-24 21:08:15 · 721 阅读 · 0 评论 -
Leetcode-235. Lowest Common Ancestor of a Binary Search Tree
一种复杂的方法:首先将从根节点到p,q两节点的路径上的结点压入栈中,处理两个栈使栈容量保持一致,同时弹出两栈中的元素,直至两栈栈顶元素相同。class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { stack s1,s2;原创 2017-01-31 21:09:57 · 257 阅读 · 0 评论 -
leetcode-107. Binary Tree Level Order Traversal II
解題思路:层序遍历结点的同时,将每层的节点放入栈中。最后将栈中元素依次弹出并返回。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : va原创 2017-02-01 12:11:38 · 186 阅读 · 0 评论 -
Leetcode-113. Path Sum II
解题思路:类似于Path Sum 的思路,只有当前节点是叶子节点并且结点的值等于暂时sum的值时才确定这是一条满足要求的路径,并把路径上的节点存入元素为向量的向量中。这要求在递归遍历节点的同时把节点放入一个临时向量中。实现起来的代码需要非常精致的技巧,每个节点的左右节点遍历完毕,需要将其弹出临时向量。class Solution {public: vector> pathSum(Tr原创 2017-02-02 22:08:30 · 354 阅读 · 0 评论 -
Leetcode-437. Path Sum III
解题思路:对当根节点进行dfs,使用类似于112-Path Sum的方法自顶向下遍历根节点的孩子节点,一旦发现满足条件就返回,不再向下遍历。但是这种思路只能通过部分测试样例。(116 / 126 test cases passed.)Input:[1,-2,-3,1,3,-2,null,-1]-1 Output:3 Expected:4原创 2017-02-03 19:46:51 · 261 阅读 · 0 评论 -
蓄水池算法
蓄水池抽样浅说 (1)http://www.jlao.net/technology/10256/蓄水池抽样浅说 (2)http://www.jlao.net/technology/10268/蓄水池抽样浅说 (3)http://www.jlao.net/technology/10282/转载 2017-02-15 23:48:23 · 325 阅读 · 0 评论 -
Leetcode-101. Symmetric Tree
解题思路:返回值为bool,即是判断某个条件是否满足的题目。其中左子树和右子树对称的条件:· 两个节点值相等,或者都为空· 左节点的左子树和右节点的右子树对称· 左节点的右子树和右节点的左子树对称则不满足以上条件的情况应返回false.解法一:class Solution {public: bool isSymmet原创 2017-02-03 23:22:57 · 198 阅读 · 0 评论 -
LLRB左倾红黑树
Left-leaning red-black BST1.红黑树的一种定义:A BST such that:・No node has two red links connected to it. 没有任何一个节点同时和两条红链接相连。・Every path from root to null link has the same number of black links.原创 2017-03-12 14:45:19 · 2753 阅读 · 0 评论 -
寻找第n大的元素
昨天看到一个题目,“寻找给定数组中第二大的元素”。这个很好考虑:假如第二大的元素是k,那么遍历整个数组大于k的元素数必然为1. 固有以下代码: for(i =0;i<10;i++) { flag = 0; for(j=0;j<10;j++) { if(arr[i] < arr[j]) flag++; if(fla原创 2013-05-04 12:00:11 · 757 阅读 · 0 评论