leetcode
冲上云霄!
心怀代码梦~
展开
-
leetcode 1131. 绝对值表达式的最大值【曼哈顿距离】
题目思路把[i,arr1[i],arr2[i] ]看做三维空间中的一个点,则所求表达式最大值,即空间中某两点间的曼哈顿距离最大值。曼哈顿距离解释如图(图源百度百科):即求解:三维空间中,曼哈顿距离最大的两点间的曼哈顿距离值。正常思路:求每两对点之间的曼哈顿距离,时间复杂度为O(n^2);简化思路:求两点间的曼哈顿距离,可以转化为:求两对点到三维空间角落的曼哈顿距离之差,时间复杂度O(n)。而三维空间存在八个角,即求每个点到八个角落的曼哈顿距离,维护每个角落的距离最大值和最小值;最后,返回原创 2020-09-17 22:00:23 · 796 阅读 · 0 评论 -
leetcode 面试题 17.13. 恢复空格【字典树】
题目思路动态规划+字典树本题的主要思路其实是动态规划:数组dp[i]的状态表示:前i个字符中,未识别的字符个数。状态转移方程:若存在j(j<=i),使得字符串sentence[j-1…i-1](下标从0开始)存在于dictionary中,则dp[i]=min(dp[i],dp[j-1]);否则,dp[i]=dp[i-1]+1;此时,问题转化为,在dictionary中匹配字符串的问题,若一个一个暴力匹配,时间消耗太大,本题采用字典树来匹配。字典树的优点:若某个前缀不是所有字原创 2020-08-30 11:55:42 · 142 阅读 · 0 评论 -
leetcode 721. 账户合并【并查集】
题目基础知识准备-并查集查找并返回所在集合的根节点:find():注意:根节点特性是:father[i]==i; 每次查找时进行路径压缩,保证集合树的高度不大于2; int find(int i) { //寻找根节点 int f = i; while (father[f] != f) //当该结点不是根节点时 f = father[f]; //上诉到父结点 //路径压缩 while (i != f) { int tmp = father[i]; father原创 2020-08-28 21:57:15 · 200 阅读 · 0 评论 -
leetcode 332. 重新安排行程【有向欧拉图,Hierholzer 算法】
题目题目分析我们首先把问题简化:每张机票是有向图中的一个边,要求经过该图每条边一次且仅一次的走法,即求该图的欧拉回路(或欧拉迹),也可以理解为----一笔画。题目中明确了,该图肯定存在欧拉回路(或欧拉迹)。对与这种:给出一个有向图,且为欧拉图,求欧拉回路的问题,我们应用Hierholzer 算法。 该算法的大概流程如下:选择任一顶点为起点,遍历所有相邻边。深度搜索,访问相邻顶点。将经过的边都删除。如果当前顶点没有相邻边,则将顶点入栈。栈中的顶点倒序输出,就是从起点出发的欧拉回路。原创 2020-08-27 13:33:43 · 294 阅读 · 0 评论 -
leetcode 861. 翻转矩阵后的得分【贪心】
题目思路贪心算法思路(注意题目中说,可以进行若干次行或列翻转):1.行翻转时,可以知道,每行的最高位为1时,翻转会让该行二进制值变小,不用翻转;否则进行翻转;2.列翻转时,只需保证,该列1的数量>0的数量,即可,若不满足,则翻转该列;3. 在列翻转时,可以连带计算该列数值的二进制和。C++代码class Solution {public: int matrixScore(vector<vector<int>>& A) { //贪心思路: //原创 2020-08-26 16:33:35 · 139 阅读 · 0 评论 -
leetcode 62. 不同路径 (动态规划)
题目思路典型的动态规划问题把m*n的地图看成m*n的二维数组dp,dp[i][j]的值是到该位置共有多少走法。简单列出几个位置的走法后可以发现:dp[i][j]=dp[i-1][j]+dp[i][j-1];这是因为:当到达位置(i-1,j)后,从(i-1,j)到(i,j)只有一种走法;同理,到达位置(i,j-1)后,从(i,j-1)到(i,j)只有一种走法。最终得到上述递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];初始状态:dp[1][1]=1…dp[1][n]=1原创 2020-08-10 18:32:47 · 220 阅读 · 0 评论 -
leetcode 15. 三数之和【数组排序+双指针】
题目思路难点在于不允许出现重复的三元组,所以不能单纯使用三重循环求解。在三重循环的基础上考虑,我们可以在三元组中指定某种顺序,例如:保证{a,b,c} 满足a<=b<=c。只访问并保存该顺序的三元组,即可规避重复问题,这时需要对原数组进行排序。解决排序问题后,还要注意可能出现重复元素,也会导致三元组重复,所以移动指针时需要跳过重复元素。在原来三重循环+排序的基础上可以发现,如果向右移动b,b的值会变大,此时c只能减小才可能满足条件,所以c只能在原来的左侧寻找,因此可以把二原创 2020-08-03 18:01:33 · 127 阅读 · 0 评论 -
leetcode 338. 比特位计数
题目难度:中等思路动态规划时间复杂度:O(n)先列出一些数字,观察它们的二进制特点,当数字i:i为奇数时,1的个数是dp[i-1]+1;i为偶数时,如果i为2的幂次,dp[i]=1;否则,dp[i]是前面某两个偶数的dp之和。为解决i为偶数时的判断,此处设置两个指针low,high,刚开始都指向2。如果low==high,证明数字i是2的幂次,dp[i]=1,重置low=2,前移high=i;如果low!=high,dp[i]=dp[low]+dp[high],low+=2。C++代原创 2020-08-02 18:08:46 · 94 阅读 · 0 评论 -
leetcode 136. 只出现一次的数字
题目难度:简单(方法很巧妙)思路如果没有时间空间限制的话题目很简单,采用哈希表,第一次插入,第二次删除,最后哈希表中留下的数字便是答案。如果要满足空间复杂度O(1),可以通过异或⊕运算,异或运算满足:a⊕a=0;a⊕0=a;满足交换律、结合律:a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。详情见官方题解 136题官方题解...转载 2020-07-30 16:49:00 · 124 阅读 · 0 评论 -
leetcode 138. 复制带随机指针的链表
题目难度:中等思路题目要求是复制原链表,需要另外新建链表,返回新建链表的头结点。但原链表结构较为复杂,从左往右遍历原链表时,不能在复制节点时,事先知道当前节点的next和random域,所以可以先复制节点并存储下来,在后续遍历过程中再补齐该节点的next和radom域。存储时利用哈希map<原链表节点,复制节点>,遍历原链表过程中,利用原链表节点去map中查看,前文遍历时是否复制过该节点:没有,则创建复制节点,存入map;有,则直接更新复制节点对应域。c++代码class So原创 2020-07-30 16:03:06 · 191 阅读 · 0 评论 -
leetcode 5. 最长回文子串
题目难度:中等思路可以看出,回文子串去掉前后单词后,仍然是回文子串。所以采用动态规划初始状态:1个单词时,是回文子串;2个单词时,若单词相等,就是回文子串,否则不是;递推公式:当满足 s[i]==s[j] 且 s[i+1 ~ j-1]是回文子串时,子串 s[i~j] 为回文子串,否则不是。C++代码class Solution {public: string longestPalindrome(string s) { int n = s.size(); vector<ve原创 2020-07-29 18:57:09 · 100 阅读 · 0 评论 -
leetode 34. 在排序数组中查找元素的第一个和最后一个位置
题目见官网 leetcode34题思路利用模板1右移左边界low,同时mid向下取整,使左边界low指向target起始位置;利用模板2右移左边界low,同时mid向上取整,使得左边界low指向target结束位置;详情请见题解:官网高赞题解转载自:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/shou-hui-man-hua-tu-jie-l转载 2020-07-28 16:23:45 · 100 阅读 · 0 评论 -
leetcode c++ 454. 四数相加 II
题目难度:中等难度见官网leetcode454题 四数相加||思路不能单纯暴力法,会导致500^4的时间复杂度,铁定超时。考虑把ABCD分为两组:AB和CD,把A[i]+B[j]的和存入哈希表中(时间复杂度:n^2);再计算t=C[k]+D[m] (时间复杂度:n^2),在哈希表中查找是否有-t,有的话,则可满足:A[i]+B[j]+C[k]+D[m]=t-t=0.整体的时间复杂度:O(n^2).c++代码class Solution {public: int fourSumCount(原创 2020-07-25 20:43:22 · 189 阅读 · 0 评论 -
数据结构 哈希 键的设计
设计键的几种方法1.当字符/数组中顺序不重要,且可唯一标识时,可使用排序后的字符串/数组作为键;2.如果只关心每个值的偏移量,通常是与第一个值的偏移量时,则可以使用偏移量作为键;3.对于树(二叉树),可以利用子树的序列化表示(序列化为字符串)作为键;4.矩阵中,可以用行索引或列索引或行列索引的组合(i+j、i-j)作为键;...原创 2020-07-25 14:14:15 · 253 阅读 · 0 评论 -
leetcode c++ 第36题 有效的数独
leetcode第36题 有效的数独 c++解法题目思路c++代码题目见leetcode官网添加链接描述思路 哈希表映射思想。 网格存在三个维度:行、列、宫格(3*3),要确保**每个维度**的数字都不会重复。 表格确定是9*9,不用担心内存占用过多,可以建立三个二维数组(哈希表),映射读取到的数字到每个维度的相应位置即可。同一位置多次映射,即返回false。c++代码class Solution {public: bool isValidSudoku(vector<vector原创 2020-07-25 11:36:56 · 130 阅读 · 0 评论