leetcode
文章平均质量分 61
刷题与总结
Android_chunhui
人不一定能什么都擅长,有自己的特点就好!
展开
-
螺丝螺母比较
【代码】螺丝螺母比较。原创 2023-08-31 19:53:35 · 202 阅读 · 0 评论 -
桶原理的应用
鸽笼原理计算最大间距问题:要求线性时间复杂度下计算数组元素在排序后的最大间距。如果直接对数组排序那么时间复杂度是nlogn,这里使用桶,设置n+1个桶这样n个元素放入后至少出现一个空桶,这就使得不同桶之间的元素差大于同内部的元素差(因为空桶两侧的桶元素差>=width,桶内元素差<width)。计算所有相邻非空桶之间元素差值(相邻桶之间的元素差可能大于空桶两侧的桶元素之间元素差)。int largestDiff(vector<int>& nums) { int.原创 2021-01-09 01:46:40 · 245 阅读 · 0 评论 -
单调栈总结
leet"255. 验证前序遍历序列二叉搜索树"题解:先序遍历搜索树,只有左子树时元素是单调递减的,但存在某一结点的右子树就不满足单调。如5/ \2 6/ \1 3输入: [5,2,6,1,3]输出: false先序遍历[5,2,1,3,6]。只有左子树[5,2,1],加入2的右子树变成[5,2,1,3]。因此为了保持栈的单调,元素大于栈顶元素,弹出栈中小于当前结点的值,并把当前节点入栈,变成[5,3],这时栈中又只剩下左子树,满足单调。最后一个弹出栈2的是当前节点3的根节点。原创 2020-12-09 10:17:08 · 215 阅读 · 1 评论 -
计算字符串表达式
整体思路:按照“符号-数字”处理字符串,将+/-运算看作数字的符号不单独运算,因此不需要考虑符号的优先级问题,在遇到非数字符号或者到达字符串结尾时处理上一个“符号-数字”组合。将括号内容看作一个数字,递归处理,遇到“)”表示当前是计算的括号内容,因此直接将结果返回,一定注意共用一个索引,用来跳过括号内容。class Solution {public: int helper(string s, int& i) { int n = s.size(), num = 0; stack<i原创 2020-09-30 15:34:33 · 633 阅读 · 0 评论 -
并查集原理及应用
并查集树形的数据结构,每个集合有其代表节点,代表节点相同的元素属于同一集合。find:通过查找节点的代表节点,判断节点所属集合。union:合并两集合,小集合合并到大集合,使用大集合的代表节点。class UnionFindSet {private: unordered_map<int, int> fatherMap; unordered_map<int, int> nodesNum;public: UnionFindSet(vector<int> ve原创 2020-05-20 18:26:04 · 223 阅读 · 0 评论 -
TrieTree
class TrieTree{public: //定义trie树节点,26个字符是定义在分支上。 struct Node { int across; int end; shared_ptr<Node> nexts[26]; Node() :across(0), end(0) {} }; typedef shared_ptr<Node> Node...原创 2019-12-23 20:37:40 · 199 阅读 · 0 评论 -
图
图的结构定义(邻接表)struct Node{ int id;//节点id,如果节点本身有值还可以加val字段。 bool visit;//是否访问 vector<shared_ptr<Node>> nexts;//从本节点出发的下一个节点,有向无向均可。 Node(int _id) :id(_id), visit(false) {}};struct Edg...原创 2019-12-23 16:21:12 · 215 阅读 · 0 评论 -
top k和第k大元素的问题
堆方法使用容量为k的最小堆,当堆满了以后,加进来的元素和堆顶元素比较,如果大于堆顶元素就先弹一个元素,再加入,否则抛弃。结果最小堆中的元素就是topk元素,堆顶元素是第k大元素。时间复杂度:调整堆O(logk)O(logk)O(logk), n个元素n∗logkn*logkn∗logk。class Solution {public: int findKthLargest(vector&l...原创 2019-12-16 12:02:36 · 294 阅读 · 1 评论 -
区间最大经过次数
给定一组区间,求重叠次数最多的子区间以及重叠次数。样例输入10 31 44 74 9样例输出3 4 4定义结构体(数值,是否为起始端),把输入放入结构体数组。先排序,数值小的在前,相同数值情况下,起始点在前。定义一个计数器,遍历结构体数组,遇到起始端计数加一,遇到结束点计数器减一,并保存最大值。最大值处保存左端点,保存下一个结束点为右端点。struct node { int ...原创 2019-12-13 11:48:33 · 463 阅读 · 0 评论 -
01背包问题及其应用
01背包问题有n个重量为w1,w2,w3…的物品,价值分别为v1,v2,v3…,现有一个容量为C的背包,问在不超过背包容量的条件下,所装物品的最大价值是多少?这个问题有两个变量,分别为物品总数n,背包容量C。记F(n,C)F(n,C)F(n,C)表示n件物品,C容量时的最大价值。考虑最后一步,F(n)F(n)F(n)能通过F(n−1)F(n-1)F(n−1)放与不放当前物品推导出来。不放当前...原创 2019-12-12 11:53:15 · 1252 阅读 · 0 评论 -
数组
1.要求数组原地改变,用快慢指针。快指针是当前遍历的位置,慢指针是处理之后数组位置,数组长度有慢指针决定。推算一遍example,确定逻辑。26. Remove Duplicates from Sorted ArrayExample 1:Given nums = [1,1,2],Your function should return length = 2, with the first ...原创 2019-07-21 16:41:20 · 182 阅读 · 0 评论 -
树-基本知识
建立树树的创建使用先序遍历创建,从上到下,每次只给根节点分配内存,并调用递归函数为其左右子树赋值。 根据先序或后续遍历和中序遍历确定树。105. Construct Binary Tree from Preorder and Inorder Traversal先在先序数组找到根节点,然后在中序数组确定根节点位置。给根节点分配内存,根据中序数组中根节点位置切分数组,构建左右子树。c...原创 2019-07-22 22:39:00 · 194 阅读 · 0 评论 -
滑动窗口法 求解最优子序列
通常动态规划解决的最优只能是数值最优,如满足条件的子序列的最小长度,最大和等等。但要求满足条件的最小长度子序列,最大和的子序列就没法做了,可以用滑动窗口法。和大于目标值的最小子序列209.Minimum Size Subarray Sum找到和大于等于target的最小尺寸子数组,返回尺寸大小。如果按照dp做,复杂度为O(n^2),有O(n)的算法,定义左右指针类似于“毛毛虫”移动,先右指...原创 2019-08-30 09:57:59 · 677 阅读 · 0 评论 -
atoi实现
请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽...原创 2019-08-30 11:15:59 · 366 阅读 · 0 评论 -
罗马数与十进制整数相互转换
roman和int都是高位在左低位在右。roman不是进位运算,roman表示的数是每个字母组合所表示数值之和。 所以罗马转整数:把每个字母组合表示的值加起来就是整数;整数转罗马数:计算出整数“千百十个”位上的数分别用罗马字母表示就是罗马数。roman->int class Solution { //但要注意小的罗马数出现在大罗马数左边是大罗马减小罗马,由于之前遍历时已经把...原创 2019-08-30 15:44:09 · 229 阅读 · 0 评论 -
链表 -->总结
1.插入排序 /*破坏掉原来链表构建新的链表,因为插入元素有可能比第一个节点元素大,所以要用辅助节点*/ class Solution { public: ListNode* insertionSortList(ListNode* head) { ListNode* dummy = new ListNode(0); while (head) { ListNode...原创 2019-07-22 15:02:24 · 566 阅读 · 1 评论 -
排序
希尔排序(shell sort)这个排序方法又称为缩小增量排序,是1959年D·L·Shell提出来的。该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直...原创 2019-04-16 10:46:14 · 328 阅读 · 1 评论 -
优先队列,二叉堆以及topK问题
1.优先队列是按照优先级排序的队列,优先级大(默认)的先出。2.二叉堆是一颗完全二叉树。树的任意节点值大于等于其子节点:最大堆。树的任意节点值小于等于其子节点:最小堆完全二叉树通常使用数组存储,节点之间对应的下标关系是:某一结点下标i,则父节点下标[i / 2], 左节点2 * i ,右节点2 * i + 1.可以认为优先队列就是实现大顶堆或小顶堆的数组。这是一个大顶堆,所以说优先队...原创 2019-09-03 20:35:05 · 373 阅读 · 0 评论 -
hash表原理
#include <iostream>#include <string>#include <stack>#include <queue>#include <vector>#include <unordered_map>#define NULL 0using namespace std; //new包括分配内存...原创 2019-09-04 02:38:40 · 237 阅读 · 0 评论 -
LRU: least recently usage
LRU缓存 : 最近最少使用的缓存机制。规则:从容器get(key):如果存在key,拿出之后这个键值对表示最常用;如果没有返回-1.put(key,value):如果容器未满,插入值后这对键值对是最常用;如果之前存在key则覆盖掉原来的值。如果容器已满,去掉最不常用的键值对再添加。这里使用一个链表(list)和哈希表(unordered_map)实现,链表表示常用的顺序。因为我们首先要根据k...原创 2019-07-17 19:49:42 · 399 阅读 · 1 评论 -
树的先序,中序,后序的非递归写法
//先序遍历:根-左-右;所以入站要先右节点在左节点class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if (!root) return res; stack<TreeNode*> st; st.push(root);...原创 2019-07-17 00:51:58 · 295 阅读 · 1 评论 -
剑指offer-- 寻找二叉树中节点和为某一定值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:利用前序遍历,将节点的值保存在容器中,便利到叶子节点时检查路径中节点的和是否满足条件,如果满足就加入最终的vector。然后回溯继续便利下一个叶子时将容器中的栈顶元素移除。cl...原创 2019-03-25 21:44:47 · 218 阅读 · 0 评论 -
剑指offer--验证是否为搜索树的后序遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:后序遍历有一个特点就是:左右中,也就是先是连续的左子树节点然后是连续的右子树节点,最后是根节点。这是个递归问题,先找出根节点,然后找出右子树节点的开始位置,如果右树节点序列出现小于根节点(搜索树特点)那么就证明不是搜索树。否则继续递归。注意...原创 2019-03-25 21:19:45 · 130 阅读 · 0 评论 -
剑指offer --验证二叉树是否对称
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:将两棵树同时输入到函数中,检查对应节点是否相同。class Solution {public: bool isSymmetrical(TreeNode* pRoot) { return check(pRoot, pRoot); } bool check(...原创 2019-03-25 15:22:55 · 127 阅读 · 0 评论 -
剑指offer---根据前序遍历和中序遍历确定树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:注意 前序遍历和中序遍历时根节点和左子树都在右子树前面。所以根据前序遍历确定根节点,再根据在中序遍历确定左右子树的元素,递归向下找出所有节点的左...原创 2019-03-02 20:15:22 · 280 阅读 · 0 评论 -
剑指offer---求二进制表示中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:将二进制数与自身-1进行与操作,可以消掉最右边的1,所以我们循环进行这种操作直到数值变成全0即可。操作的次数就是1的个数。int NumberOf1(int n) { int cnt = 0; while (n) { n = n & (n - 1); cnt++; } return c...原创 2019-02-25 22:07:48 · 164 阅读 · 0 评论 -
剑指offer---矩形覆盖
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:感觉计算有多种方法的都是吧可能次数列出来,找数列的通项公式。n=1, 2, 3, 4, 5c=1, 2, 3, 5, 8从1开始的斐波那契数列int recover(int number) { if (number == 1) return ...原创 2019-02-25 21:53:05 · 109 阅读 · 0 评论 -
剑指offer --- 跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路:列出前5项,n=1, 2, 3, 4, 5c =1 ,2, 3, 5, 8所以根本就是从1开始的斐波那契数列int jumpFloor(int number) { if (number == 1) return 1; if (number == ...原创 2019-02-25 21:32:39 · 126 阅读 · 0 评论 -
剑指offer---小技巧
1+…+n题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。//考查逻辑与&&的短路特性,当前面为假时不在计算后面,可以作为递归终止条件。class Solution {public: int Sum_Solution(int n) { int ans = n; ...原创 2019-02-28 10:47:22 · 205 阅读 · 0 评论 -
剑指offer-- 复杂链表复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:难点主要是random节点的复制,原链表中random节点有两种:为NULL;存在。思路是1.在原链表每个节点后面复制节点;2.处理random节点;3.拆分节点(一...原创 2019-03-26 09:19:36 · 159 阅读 · 0 评论 -
剑指offer--不用四则运算符求和
题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:求和过程分为两部:求各位上的值,求进位值。然后将这两个数当作两个加法项递归进行直到进位制为0.如7 + 5:各位值2,进位值10, 下一次分别为12,0递归结束,结果为12.这里要按二进制处理,二进制数求各位值是异或:0111 ^ 0101 = 0010,求进位值是与操作再左移一位。(0111 &am...原创 2019-03-29 21:58:50 · 188 阅读 · 0 评论 -
赛码网
题目描述头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队。每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来。在选题之前,我们对题目进行了盲审,并定出了每道题的难度系数。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a, b, c,我们希望这3道题能满足下列条件:a<= b<= cb - a<= 10c - b<= 10所有出...原创 2019-06-29 20:25:14 · 1459 阅读 · 0 评论 -
leetcode题型
合并两个有序序列,尽量利用已有空间。(1)合并有序数组:Input:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3Output: [1,2,2,3,5,6],其中nums1数组无限大。不要太纠结于不能分配空间上面,从新空间的位置从后向前,放两个数组中较大的元素。这样避免了插入时移动元素,新空间就是nums1数组,...原创 2019-06-10 20:24:52 · 247 阅读 · 0 评论 -
动态规划(leetcode)小结
适用问题常用于寻找符合条件的最优子序列,思路枚举数组长度为1,2…时的解,找出递推关系式,即可求解。类型(1) 对子序列顺序做限制,比如连续子序列的最大和/最大乘积,子序列元素必须是间隔1的元素等。用dp[i]表示包含当前元素num[i]的局部最优解,最后从整个dp数组找全局最优。 House Robber: 给定数组表示抢劫每个房子的收益,限制抢劫的房子不能相邻,要...原创 2019-05-18 14:12:53 · 535 阅读 · 0 评论 -
leetcode--卡德兰序列
卡德兰序列: h(n) = h(0)*h(n-1) + h(1)*h(n-2) + … + h(n-1)*h(0)1,2,5,14,典型应用:括号化问题。矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)出栈次序问题。 一个栈(无穷大)的进栈序列为1,2,3,…n,有多少个不同的出栈序列? ...原创 2019-04-19 21:59:00 · 821 阅读 · 0 评论 -
leetcode --电话号码的字符组合(地平线面试题)
题目描述Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) ...原创 2019-04-16 20:19:47 · 470 阅读 · 0 评论 -
leetcode---最长不重复子串
Given a string, find the length of the longest substring without repeating characters.Example 1:Input: “abcabcbb”Output: 3Explanation: The answer is “abc”, with the length of 3.Example 2:Input: ...原创 2019-04-13 00:09:36 · 314 阅读 · 1 评论 -
剑指offer--构建乘积数组
题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。思路:就是计算这个元素之前所有元素积和之后所有元素积。如果没计算一个元素都要将前面和后面所有元素撑起来复杂度是O(n2),这里计算前向乘积数组,每个元素都是当前元素和之前元素乘积,反向数组每个元素是当前位置元...原创 2019-03-28 21:39:29 · 127 阅读 · 0 评论 -
剑指offer--把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:其实332 > 323, 就是排列问题,不过是字符串形式的。需要重新定义比较规则:ab > ba : a>bab < ba : a<bab == ba: a==b。按照定...原创 2019-03-28 16:11:04 · 137 阅读 · 0 评论 -
栈与队列
能查最小值的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:定义一个data栈和mins栈分别存放原始数据和最小值,注意两个栈长度相同。当push时如果值小于mins栈顶数字就入栈否则入mins的栈顶元素,这样就保证了mins栈顶元素一直是data栈中最小的。pop时一起出栈。比如,data中依次入栈,5, 4,...原创 2019-02-28 10:21:44 · 181 阅读 · 0 评论