![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
超喜欢榴莲吖
许愿未来温暖阳光,满身宠爱
展开
-
529. 扫雷游戏
乍一看有点复杂,其实就完全按照每个规则实现就行。class Solution {private: int dx[8]={0,0,1,-1,1,1,-1,-1}; int dy[8]={1,-1,0,0,1,-1,1,-1}; int n,m;public: vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>..原创 2020-08-20 23:16:20 · 104 阅读 · 0 评论 -
22. 括号生成
题目方法一:暴力暴力生成所有可能的括号组成,对于每个组成判断是否合理。class Solution { public List<String> generateParenthesis(int n) { List<String> res=new ArrayList<String>(); dfs(res,0,new char[2*n]); return res; } void dfs(List&原创 2020-08-14 23:50:51 · 119 阅读 · 0 评论 -
43. 字符串相乘
题目方法一:先乘法再加法按照平时做乘法的思路即可。这里比较巧妙的一点是,直接用字符形式做乘法和加法,对于移位问题,就通过填补0来直接处理。自己第一次做的时候就是因为没有想到这个方法,所以必须转为整数才能实现。class Solution { public String multiply(String num1, String num2) { if(num1.equals("0")||num2.equals("0")){ return "0";原创 2020-08-13 10:03:25 · 151 阅读 · 0 评论 -
133. 克隆图
深拷贝:对于一张图而言,它的深拷贝即构建一张与原图结构,值均一样的图,但是其中的节点不再是原来图节点的引用。因此,为了深拷贝出整张图,我们需要知道整张图的结构以及对应节点的值。由于题目只给了我们一个节点的引用,因此为了知道整张图的结构以及对应节点的值,我们需要从给定的节点出发,进行「图的遍历」,并在遍历的过程中完成图的深拷贝。/*// Definition for a Node.class Node { public int val; public List<Node>.原创 2020-08-12 08:27:37 · 107 阅读 · 0 评论 -
130. 被围绕的区域
题目这道题思路非常妙,采用了由边界向里面扩展的方法。题目要求是将非边界的0填充为x,与边界0直接或者间接相连的0不需要填充,如果直接判断0是否被包围是难以判断的,但是将所有边界0对应的0连通区域找出来是简单的,因此,可以从边界0出发,DFS判断每个连通区域,对其中的0进行标记,那么标记过的0就是不需要改为x的0。之后将未标记过的0改为x即可。class Solution {private: int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1};原创 2020-08-11 08:35:04 · 102 阅读 · 0 评论 -
99. 恢复二叉搜索树
二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。这道题的关键是找到两个被错误交换的节点。对于二叉搜索树,一定要把握住各个遍历对应的特征。二叉搜索树+中序遍历–> 可以得到一个有序数组。那么问题转化为:在一个有序数组中,将两个数交换后,怎样找到这两个数。例如,[1 2 3 4 5 6 7 8] ,如果变成 [1 2 6 4 5 3 7 8],那么这两个数的特点是 6>4,5>3。方法一:显示中序遍历因此,最直接的方法是:1)中序遍历得到有序数组2)原创 2020-08-10 08:40:31 · 101 阅读 · 0 评论 -
93. 复原IP地址
题目递归。官网解析如下:递归的编写水平还是太低了,主要还是思想上不到位。class Solution { static final int SEG_COUNT=4; List<String> ans=new ArrayList<String>(); int[] segment=new int[SEG_COUNT]; public List<String> restoreIpAddresses(String s) {原创 2020-08-10 07:29:35 · 126 阅读 · 0 评论 -
336. 回文对
题目题解:class Solution { public boolean isPalindrome(String s, int left, int right) { int len = right - left + 1; for (int i = 0; i < len / 2; i++) { if (s.charAt(left + i) != s.charAt(right - i)) { retu原创 2020-08-08 09:35:20 · 135 阅读 · 0 评论 -
337. 打家劫舍 III
题目树上DP。对于树的一个节点开始,它的子树可以盗取的最大金额由它的两个状态组成:该点被盗,记为f(i)该点不被盗,记为g(i)则 fff 和 ggg 由其左右节点的状态决定:f(i)=node.val+g(l)+g(r)f(i)=node.val+g(l)+g(r)f(i)=node.val+g(l)+g(r)g(i)=maxg(i)=maxg(i)=max{f(l),g(l)}+max\lbrace f(l),g(l)\rbrace+max{f(l),g(l)}+max{f(r),g原创 2020-08-05 09:32:23 · 134 阅读 · 0 评论 -
415. 字符串相加
题目这道题很简单,主要是对自己的丑代码和非常漂亮的代码做个对比,希望之后能向着这个方向努力。代码风格还是非常重要的。Java中要学会用StringBuffer,其中append方法可以对int,char,double等自动进行转换,转为符合字符串的条件。class Solution { public String addStrings(String num1, String num2) { int i = num1.length() - 1, j = num2.length(原创 2020-08-03 08:10:51 · 104 阅读 · 0 评论 -
114. 二叉树展开为链表
题目给定一个二叉树,原地将它展开为一个单链表。方法一:前序遍历递归前序遍历记录节点,然后重新展成单链表。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *原创 2020-08-02 22:44:58 · 90 阅读 · 0 评论 -
Leetcode--二叉树合集(简单)
面试题 04.02. 最小高度树题目要使二叉搜索树高度最小,应该尽量平衡两边高度,当树中的任意结点的左右子树高度差都不超过 1 时,整棵树的深度最小 --> 即创建平衡二叉树。原创 2020-07-30 07:55:00 · 179 阅读 · 0 评论 -
5457. 和为奇数的子数组数目
题目这道题不知道为什么开始一直想不明白,看到前几名的大佬们都是几分钟就搞定了,日常感叹自己的菜啊…这道题主要使用前缀和。若到当前为止前缀和为奇数,那么前面有多少个前缀和为偶数的,当前就有多少个子数组和为奇数的(奇数+偶数=奇数);同理,若当前前缀和为偶数,则子数组和为奇数的个数=前缀和为奇数的个数。class Solution {public: int numOfSubarrays(vector<int>& arr) { long long even=0原创 2020-07-27 09:10:55 · 262 阅读 · 0 评论 -
329. 矩阵中的最长递增路径
题目参考思路:将矩阵看成一个有向图,每个单元格对应图中的一个节点,如果相邻的两个单元格的值不相等,则在相邻的两个单元格之间存在一条从较小值指向较大值的有向边。问题转化成在有向图中寻找最长路径。class Solution {public: static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int rows, columns; int longestIncreasingPath(vec原创 2020-07-26 12:23:25 · 109 阅读 · 0 评论 -
Leetcode--拓扑排序
207. 课程表题目拓扑排序典型题。采用逐步删除入度为0点的方法。class Solution {public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { vector<vector<int>> d(numCourses); int n=prerequisites.size(); vector原创 2020-07-26 11:52:54 · 317 阅读 · 0 评论 -
410. 分割数组的最大值
题目给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:输入: nums = [7,2,5,10,8] m = 2输出: 18很好的一道题,对于动态规划和二分查找都是比较经典的一种问法。<可惜菜菜子一个都没想到,还是要多练习才对啊(T_T)>方法一:动态规划「将数组分割为 m 段,求……」原创 2020-07-25 09:11:09 · 107 阅读 · 0 评论 -
1025. 除数博弈
题目链接博弈题一般可以通过递推打表找规律。F【i】:数字为i时,先手的状态。则只要i可以通过一步j转化到F[i-j]为败的状态,F【i】就是胜的状态。打表可以看出来,如果N为奇数,先手败;N为偶数,先手胜。也可以通过数学推导和证明得出上述结论。class Solution {private: void dabiao(int N){ vector<bool> f(N+5,false); f[1]=false; f[2]=tru原创 2020-07-24 07:36:19 · 79 阅读 · 0 评论 -
leetcode--trie树
208. 实现 Trie (模板题)题目class TrieNode{ boolean isWord; TrieNode[] children=new TrieNode[26]; TrieNode() {}}class Trie { TrieNode root; /** Initialize your data structure here. */ public Trie() { root=new TrieNode();原创 2020-07-19 20:40:00 · 128 阅读 · 0 评论 -
leetcode动态规划——字符串系列
139. 单词拆分题目给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true因为 “leetcode” 可以被拆分成 “leet code”。示例 2:输入: s = “applepenapp原创 2020-07-19 15:38:37 · 703 阅读 · 0 评论 -
312. 戳气球
题目官方题解这道题的思路真的非常好,如果正向考虑戳破气球,最大的困难是这个气球戳破后要消除,然后继续判断。因此,选择逆向思考:从无到有,考虑最后一个戳破的球球是哪个。更直接的方法就是题解中给出的方法一,记忆化递归,就是完全按照上面的这种做法得到最终答案的,而动态规划将这种递归方式用方程式表达。class Solution {public: int maxCoins(vector<int>& nums) { int n=nums.size();原创 2020-07-19 09:55:23 · 83 阅读 · 0 评论 -
leetcode动态规划--滚动数组
题目给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。示例 1:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输出: true示例 2:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”输出: false动态规划。(这道题用动态规划确实是没有想到的)f(i,j):s1的前i个元素和s2的前j个元素能否交错组成s3的前i+j个元素。f(i,j) =原创 2020-07-18 08:25:31 · 249 阅读 · 0 评论 -
二分图
二分图定义:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。785. 判断二分图题目对于图中的任意两个节点 u 和 v,如果它们之间有一条边直接相连,那么 u 和 v原创 2020-07-16 12:12:56 · 135 阅读 · 0 评论 -
矩阵快速幂
50. Pow(x, n)题目实现 pow(x, n) ,即计算 x 的 n 次幂函数。这里注意n的正反数越界问题。和leetcode 29. 两数相除这道题的注意点比较像,即当n取负数最小值时,其相反数会溢出。class Solution { public double myPow(double x, int n) { double ans=1.0; double xx=x; int sign=1; long N=(long)原创 2020-07-15 22:16:39 · 94 阅读 · 0 评论 -
罗马数字
12. 整数转罗马数字题目这道题开始想的非常复杂,不知道怎么处理I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。这样三种特殊情况,想着分类讨论。实际上,完全可以将这六个特殊字符和给出的七个字符合在一起,作为十三个字符一起讨论。讨论时,采用贪心的思想,从最大到小依次排列递减。具体看代码。clas原创 2020-07-15 22:00:43 · 254 阅读 · 0 评论 -
不同的二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树:题解要构建不同的二叉树,只要根节点不同,那么一定是不同的二叉树。因此,考虑以每个数值为根节点,构建左右子树不同的二叉树,最后可以得到所有二叉树。G(n): 长度为 n 的序列能构成的不同二叉搜索树的个数。F(i, n): 以 i 为根、序列长度为 n 的不同二叉搜索树个数 (1≤i≤n)。最后需要求得:G(n)其中,G(0)原创 2020-07-15 20:54:39 · 281 阅读 · 0 评论 -
leetcode 29. 两数相除
题目给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3.33333…) =truncate(原创 2020-07-14 23:55:16 · 668 阅读 · 0 评论 -
leetcode 120. 三角形最小路径和
题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是下标 与 上一层结点下标 相同等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3] ]这道题是很简单的一道DP题,这里主要是学习怎样将二维数组转化为一维数组。直接的二维DP:class Solution { public int minimumTotal(List<List<Integ原创 2020-07-14 22:39:08 · 89 阅读 · 0 评论 -
数组取交集
349. 两个数组的交集题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。方法一:set主要利用set去重。class Solution {public: vector<int> inter原创 2020-07-13 11:08:48 · 1198 阅读 · 0 评论 -
174. 地下城游戏
题目一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健原创 2020-07-12 16:16:06 · 130 阅读 · 0 评论 -
数字之和系列
1. 两数之和题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9, 所以返回 [0, 1]很简单的哈希表即可。class Solution {public: vector<int>原创 2020-07-11 21:58:03 · 887 阅读 · 0 评论 -
leetcode树状数组
315. 计算右侧小于当前元素的个数题目给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入: [5,2,6,1]输出: [2,1,1,0]解释: 5 的右侧有 2 个更小的元素 (2 和 1).2 的右侧仅有 1个更小的元素 (1).6 的右侧有 1 个更小的元素 (1).1 的右侧有 0 个更小的元素.很直接的树状数组。树状数组找数值对的这原创 2020-07-11 17:35:28 · 381 阅读 · 1 评论 -
leetcode股票系列
121. 买卖股票的最佳时机题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前原创 2020-07-10 20:08:30 · 706 阅读 · 0 评论 -
86. 分隔链表
题目给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5第一次做的时候想直接改变链表中指针位置来重构满足条件的链表,发现不好实现。应该直接开两个新的链表,分别储存小于x和大于等于x的两部分,再做拼接。/** * Defin原创 2020-07-10 11:55:25 · 71 阅读 · 0 评论 -
删除链表节点
83. 删除排序链表中的重复元素题目给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* delete原创 2020-07-10 10:45:38 · 89 阅读 · 0 评论 -
23. 合并K个排序链表
题目链接合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->61. 顺序两两合并/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2020-07-09 10:07:43 · 122 阅读 · 0 评论 -
剑指offer——字符串(Leetcode)
面试题05. 替换空格题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。输入:s = “We are happy.”输出:“We%20are%20happy.”主要体会不同语言下的字符串替换使用。C++:class Solution {public: string replaceSpace(string s) { string ans; for(int i = 0; i<s.size(); i++) {原创 2020-06-24 20:57:37 · 91 阅读 · 0 评论 -
15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]class Solution {public: vector<vector<int>> threeSum(vecto原创 2020-06-12 16:49:57 · 83 阅读 · 0 评论 -
剑指offer——数学类问题集合(Leetcode)
面试题10- I. 斐波那契数列题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。输入:n = 5输出:5法一:直接按照递推式写即可。原创 2020-06-12 16:17:41 · 748 阅读 · 0 评论 -
739. 每日温度
题目根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。使用单调栈,栈内维护递减序列。注意,栈中存放的是数原创 2020-06-11 21:12:49 · 124 阅读 · 0 评论 -
9. 回文数
题目判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。要求:不将整数转为字符串来解决这个问题考虑将数字翻转,然后比较是否一致。存在问题:可能翻转后会溢出考虑将数字一分为2,翻转后半个数字,然后和前半个比较是否一致。怎样判断已经是一半数字?当前数是x,那么会一直x%10,x/10;当当前数已经小于等于后面的翻转数时,代表已经一半了。首先要判断一些特殊情况:1)所有个位是 0 的数字不可能是回文,因为最高位不等于 02)负数class Solution原创 2020-06-10 10:37:56 · 85 阅读 · 0 评论