leetcode
硬看黑学头秃秃
这个作者很懒,什么都没留下…
展开
-
leetcode热题100刷题笔记(5)
94.二叉树的中序遍历思路如果用递归的方法来写,此题非常的简单,是一个基础题,要熟悉的是非递归的迭代版本,利用栈来求解代码递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ...原创 2020-03-30 15:31:00 · 569 阅读 · 0 评论 -
leetcode热题100刷题笔记(4)
目录78.子集思路:代码79.单词搜索思路代码84.柱状图中的最大矩形思路代码85.最大矩形思路代码78.子集思路:这是经典的回溯法的题目:定义一个回溯方法 dfs(first, temp,nums),第一个参数为索引 first,第二个参数为当前子集temp。如果当前子集构造完成,将它添加到输出集合中。否则,从 first 到 mums.size()-1 遍历索引 i。将整数 n...原创 2020-03-27 23:34:36 · 474 阅读 · 0 评论 -
leetcode热题100刷题日记(3)
72.编辑距离思路编辑距离是一个很经典的动态规划的问题,其难点在于状态的定义,在此题中,需要一个二维的dp数组,dp[i][j] 表示 s1 的前 i 个字母和 s2 的前 j 个字母之间的编辑距离。而状态转移方程的确定,也需要分情况谈论:1. 当s1[i-1]==s2[j-1],因为下标从0开始,所以实际上是s1的第i个字符和s2的第j个字符相等,那么此时这两个字符不需要变换,所以 d...原创 2020-03-15 22:54:09 · 133 阅读 · 0 评论 -
leetcode热题100刷题笔记(2)
文章目录每日一题:543.二叉树的直径思路代码62.不同路径思路代码递归版本(会超时):动态规划版本:64.最小路径和代码70.爬楼梯思路代码暴力递归(会超时)动态规划每日一题:543.二叉树的直径思路这道题很容易看出来可以用dfs解决,但是其中有一个容易迷惑的点,就是所谓的“最长路径”并不一定经过根节点!因此,我们需要在dfs的过程中,对每一个节点,计算其左子树的高度L以及右子树的高度...原创 2020-03-10 22:52:22 · 411 阅读 · 0 评论 -
leetcode热题100刷题笔记(1)
跳跃游戏II:class Solution {public: int jump(vector<int>& nums) { int ans=0,begin=0,end=1; while(end<nums.size()){ int temp = 0; for(int i=begin;i...原创 2020-03-09 22:37:33 · 314 阅读 · 0 评论 -
leetcode 121——买卖股票的最佳时机
思路:这道题刚上手很容易想到动态规划,但是仔细想想并没有那么复杂,只需要将当前的最小数值记录下来,再不断去更新最大利润值即可代码:class Solution {public: int maxProfit(vector<int>& prices) { int currentMin = 10e9,maxp = 0; for(int...原创 2020-03-09 12:25:23 · 107 阅读 · 0 评论 -
leetcode 49——字母异位词分组
思路:看到这个题目,第一反应是,搞一个map,将key设置为各个字符串的ASCII码值之和,value设置成vector< string >,把ASCII码值之和相同的字符串组合在一起就行但是这样的解法显然是错误的,因为不一样的字符串ASCII码值之和也可以相同,甚至字符串的长度都不一定一样后来想到,只要将每个字符串内部都按照字典序排个序,就可以很轻松的找到字母异位词代码:...原创 2020-03-08 00:11:27 · 110 阅读 · 0 评论 -
leetcode 46 ——全排列
class Solution {public: vector<int> temp; vector<vector<int>> ans; void dfs(vector<int>& nums,vector<int>& temp,vector<vector<int>>& ...原创 2020-03-04 18:57:01 · 111 阅读 · 0 评论 -
leetcode 994——腐烂的橘子
思路:类似迷宫问题,这种一层层向外扩展的问题,一般都是广度优先遍历(BFS),这是一道模版题在方向的选择上,设置两个数组dx和dy,同步遍历即可while循环完成一次,就是成功感染了一圈的橘子,res+1while循环结束以后,如果还有没被感染的橘子,直接返回-1int dx[]={0,-1,0,1},dy[]={-1,0,1,0};class Solution {public:...原创 2020-03-04 17:40:11 · 129 阅读 · 0 评论 -
leetcode 33 —— 搜索旋转排序数组
思路:题目中要求时间复杂度必须是O(log N)级别,由此很容易想到折半查找,但是折半查找要求数组必须是有序排列的,这也是处理的难点,观察旋转后的数组,画个折线图:很容易发现:在转折点的前后,数组都是递增的,并且转折点之后的最大值,一定小于之前的最小值,由此总结出三种情况: nums[0] <= target <= nums[i] target &...原创 2020-02-23 13:40:58 · 152 阅读 · 0 评论 -
leetcode 32——最长有效括号 JAVA
思路:看到“最长…子串”这样的字眼,第一时间想到的就是动态规划,其中最核心的部分就是状态转移方程的确定,对于此题来说,我将dp[i]的意义定义为:以s[i]结尾的最长有效子串的长度,所以,如果s[i]为 ‘(’,那么dp[i] == 0,因为有效的子串不可能以 ‘(’ 结尾而对于s[i] 为‘)’的情况来说,需要考虑两种情况:1.s[i-1]=‘(’,也就是"…()"的形式,那么dp[i]...原创 2020-02-21 22:33:29 · 149 阅读 · 0 评论 -
leetcode 31——下一个排列
class Solution {public: void nextPermutation(vector<int>& nums) { int i = nums.size() - 2; while (i >= 0 && nums[i + 1] <= nums[i]) { i--; ...原创 2020-02-21 20:56:57 · 136 阅读 · 0 评论 -
Leetcode 23——合并K个排序链表 C++
此题的解法可以借鉴归并排序的做法,也体现了分治的思想:首先实现一个合并两个链表的函数mergeTwoLists;再将合并lists中所有的链表这个大问题,分解成“合并左部分的一半,再合并右边的一半,最后再进行一次合并”这样的小问题,并且这个小问题还可以继续细分下去,直到变成只需要合并两个链表,这样的步骤可以递归进行实现:/** * Definition for singly-linked...原创 2020-02-21 14:00:40 · 152 阅读 · 0 评论 -
leetcode 22——括号生成
题目:方法一:深度优先遍历(dfs)思路:不难看出,此题目的解空间树是一棵高度为n的满二叉树,按照深度优先遍历的方法,搜索所有的叶子节点,再去判断哪些是符合条件的解,返回即可,这是不难想到的。但是,这道题目显然是可以进行剪枝的,观察一下解空间树的中间节点,可以发现只要当前节点中的右括号比左括号多,那这个分支下的叶子节点就不可能是正确的解,因此,用left代表剩余的’(’,用right代表剩...原创 2020-02-13 22:16:09 · 162 阅读 · 0 评论 -
leetcode 21 —— 合并两个有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* ans = new ListNode(0); ListNode* head = ans; while(l1!=NULL && l2!=NULL){ if(l1->val&l...原创 2020-02-12 18:19:03 · 103 阅读 · 0 评论 -
leetcode 17——电话号码的字母组合(JAVA版本)
思路:本题可以使用回溯法进行解决在leetcode的官网题解的评论之下,有人质疑该方法只不过是递归构造,暴力枚举,并没有所谓的回溯,实际上大可不必纠结这样的细节因为所谓的回溯法本质上还是属于暴力法的,只不过它将生成过程和检查过程结合了起来,不必对 解空间树 的叶结点一一地进行检查了,相当于对解空间树做了一次剪枝,把错误结果的分支去掉;而如果画出此题的解空间树,会发现压根也不需要剪枝,:...原创 2020-02-05 12:18:37 · 222 阅读 · 0 评论 -
leetcode15 三数之和 c++
class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans; vector<int> v; sort(nums.begin()...原创 2020-01-29 00:26:43 · 209 阅读 · 0 评论 -
leetcode11 盛最多的水
双指针法设置一个头指针start,一个尾指针end;刚开始时保持矩形的长度最长,之后开始从两边向中间夹;在牺牲长度的前提下,尝试能否通过使较短的宽更长,来获得更大的面积。代码如下:class Solution {public: int maxArea(vector<int>& height) { int start=0,end=height....原创 2020-01-27 23:42:47 · 227 阅读 · 0 评论 -
leetcode 第五题 最长回文子串
class Solution {public: string longestPalindrome(string s) { if(s.size()==1||s.size()==0) return s; int start=0,end=0,l=0; string ans; for(int i=0;i<s.size();i+...原创 2020-01-27 22:05:05 · 72 阅读 · 0 评论 -
leetcode 第三题
第一次的错误解法class Solution {public: int lengthOfLongestSubstring(string s) { map<char,bool> isExist; int dp[100000]={1}; isExist[s[0]]=true; int max=0; ...原创 2020-01-25 22:45:14 · 135 阅读 · 0 评论 -
Leetcode 第2题 两数相加
/** 1. Definition for singly-linked list. 2. struct ListNode { 3. int val; 4. ListNode *next; 5. ListNode(int x) : val(x), next(NULL) {} 6. }; */class Solution {public: ListNo...原创 2020-01-24 12:53:08 · 106 阅读 · 0 评论 -
leetcode 5308 或运算的最小翻转次数
greedy(贪心算法)class Solution {public: int minFlips(int a, int b, int c) { int i,ans=0; for(i=0;i<30;i++) //如果c的二进制表示此位为1 if(c>>i&1) //仅当a和b此位...原创 2020-01-12 12:52:53 · 120 阅读 · 0 评论