leetcode
我是飞酱
目前是个大三仔,正在为秋招做准备!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Leetcode 213-220刷题笔记(非困难题目)
213.打家劫舍2 该题目和之前的打家劫舍有点类似,不过该题目是一个的家庭是环形(代表第一位和最后一位不能够同时盗窃)。 讲这道题我们可以将环形进行拆分,既然首位不发同时获取到,那么我们不如将这个环拆分成两个单列表(一个不包含第一家,一个不包含最后一家),根据这个情况的话我们可以将两个单列进行两次打家劫舍,取最大值即可。 注意:有两种特殊情况需要进行考虑一下,长度 = 0 / = 1,因为无法数组无法进行割舍。 public int rob(int[] nums) { if(nums.原创 2020-12-24 16:16:40 · 244 阅读 · 0 评论 -
Leetcode 191-210刷题笔记(非困难题)
198.打家劫舍 题目要求两个相邻的家不能同时被偷(暗示偷窃需要间隔n个家(n >=1))。 看到这种题目,我们很容易联想到使用动态规划的思想进行求解。 我们声明一个dp数组用于保存偷窃到该户时,能够产生的最大价值。 那么这个动态规划的状态转移方程式是什么? 我们通过需要间隔可以发现,最基本有两种偷窃模式: 偷窃当前门户,那么获得上上个的最大价值和当前门户的价值。 不偷窃当前门户,则我们可以获得上一户的最大价值。 就可以得出 dp[i] = Max(dp[i-1],dp[i-2]+nums[i])原创 2020-12-20 17:13:45 · 299 阅读 · 1 评论 -
Leetcode171-190刷题笔记(非困难题)
171.Excel表列序号 该题目就有点类似于一个进位为26的一个进制转换的题目。 public int titleToNumber(String s) { int ans = 0; for(int i=0; i<s.length(); i++) { ans *= 26; ans += s.charAt(i) - 'A' + 1; } return原创 2020-12-19 15:36:54 · 340 阅读 · 3 评论 -
Leetcode 151-160刷题笔记(非困难题目)
151.反转字符串的单词 该题目有点类似于字符串的反转,但是该题目需要保证的是字符串内的单词反转后仍然是原先单词,并且格式以“单词1 单词2 单词3”的格式(即需要去除多余空格) 针对于这么频繁的字符串操作我们自然就想到使用的是StringBuilder类 刚好他自带了一个reverse()方法用于字符串反转,剩下的部分我们只需要对空格进行处理和内部单词的顺序进行处理。 1.空格部分我是用的计数法,对多次重复出现的空格采取删除。 2.内部单词顺序我采用正常的字符串反转的方法,对其反转,则需要精准截取字符串即原创 2020-12-15 16:14:44 · 133 阅读 · 0 评论 -
Leetcode141-150刷题笔记(非困难题目)
141.环形链表 该题目是判断该链表是否存在环形结构,我们可以使用额外O(N)空间对结点进行保存,看是否存在重复。 也可以使用我们常用的快慢结点法,判断快慢结点是否会碰头。 //判断是否为环形链表 public boolean hasCycle(ListNode head) { //快慢指针法 ListNode slow = head; ListNode fast = head; while(fast != null &原创 2020-12-12 17:21:23 · 156 阅读 · 0 评论 -
Leetcode 131-140刷题笔记(非困难题目)
131.分割回文串 该题目使用的是回溯法,在添加到集合前,我们需要判断一下是否为回文串,如果不是则不添加。 在是否为回文串我们可以采用动态规划的思想,对这个字符串进行一个预处理。 //字符串拆分成回文子串 public List<List<String>> partition(String s) { List<List<String>> lists = new ArrayList<>(); if(s.原创 2020-12-10 16:59:31 · 156 阅读 · 0 评论 -
Leetcode 121-130刷题笔记(非困难题目)
121.买卖股票的最佳时机 该题目是只允许买卖一次股票,那么就对于我们买卖的时机需要斟酌。 我们买卖股票肯定不能选择亏本生意,所以说必须买入 <= 卖出,并且买入要晚于卖出。 根据这一特性,我们通过一个 min 的变量标记最低点,如果碰到比最低点还低的值,那么我们就可以选择更换最低点,不然则用以前的 min 计算卖出利润。 //卖股票最佳时机 public int maxProfit(int[] prices) { int ans = 0; //标记一原创 2020-12-09 16:10:18 · 148 阅读 · 0 评论 -
Leetcode111-120刷题笔记(非困难题目)
111.二叉树的最小深度 该题目和之前的最大深度有点类似,但是该题目因为是求的是从根节点出发到最近的一个叶子结点,所以当我们出现结点只有一边子树的时候,我们需要走单边,而不是碰到了子树就返回,那么算出来的结果就是有问题的(举例是树退化成链表的样式) //树的最小深度(从根结点出发,到达最近的叶子结点的结点个数) public int minDepth(TreeNode root) { if(root == null) { return 0;原创 2020-12-06 16:08:09 · 149 阅读 · 0 评论 -
Leetcode 101-110刷题笔记(非困难题目)
101.对称二叉树 该题主要就是通过比对对应位置的值是否相同,难点在于如果选取对位(因为是对称),通过观察我们可以发现,他是两个节点比对结束后,一个的左子树和另一个的右子树进行比对,比对结束后在比对前一个的右子树和现在的左子树,通过这带点我们可以发现关系。 在这里插入代码片 //对称的二叉树 public boolean isSymmetric(TreeNode root) { return compare(root,root); } public boole原创 2020-12-05 17:09:27 · 184 阅读 · 0 评论 -
Leetcode 91-100刷题笔记(非困难题目)
91.解码方法 该题目有点类似于与跳台阶问题,使用的是动态规划算法。 我们可以选择截取后面一位,或者截取后面两位,如果后面一位符合逻辑则加上前面的dp值,两位也是一样的。 1.一位需要保证值 > 0 2.两位需要保证 10 <= 数值 <= 26 满足以上条件才能说明是合格的编码,才能够截取。 //解码(动态规划) public int numDecodings(String s) { int len = s.length();原创 2020-12-03 16:06:34 · 189 阅读 · 0 评论 -
Leetcode 81-90刷题笔记(非困难题目)
81.搜索旋转排序矩阵2 该题和之前的也是类似,区别在于该题存在重复元素的可能性,所以需要针对这个重复元素进行一个处理,其余部分的思路和以前的那个题目是一样(二分法) 该题针对重复元素,我这里是选择跳过,直到遇到非重复元素为止。 //搜索旋转数组的变种(包含重复元素) public boolean search(int[] nums, int target) { int left = 0; int right = nums.length - 1;原创 2020-12-02 15:29:43 · 145 阅读 · 0 评论 -
Leetcode 71-80刷题笔记(非困难题目)
71.简化路径 该题目就是使用了一个双向队列进行操作,没有什么难度 public String simplifyPath(String path) { String[] change = path.split("/"); Deque<String> deque = new LinkedList<>(); for(int i=0; i<change.length; i++) { if(change[i原创 2020-12-01 15:42:59 · 141 阅读 · 0 评论 -
Leetcode61-70 刷题笔记(非困难题目)
61.旋转链表 该题目我们的主要思路可以从旋转链表 -> 找到链表环的断开位置。 1.首先需要将链表成环,并且记录链表长度。 2.将旋转次数进行缩减(比如转几圈和转一圈的位置是一样的),使用于length取余的方式。 3.寻找断开点 public ListNode rotateRight(ListNode head, int k) { if(head == null) {return null;} //将链表成环 ListNode temp =原创 2020-11-30 16:39:05 · 144 阅读 · 0 评论 -
Leetcode 51-60刷题笔记(非困难题目)
53.最大子序和 该题目主要的思考就是在遍历数组时候是否考虑加上前面数组。 例如样例 [-2,1,-3,4,-1,2,1,-5,4] 我们从 下标 1 开始遍历,此时prev数组 = -2,那么此时我们如果将 -2 加入子数组中那么会导致综合减少(因为prev数组和 < 0),所以此时应当将 1 作为新子数组的头部,继续向后遍历(此时需要记录最大子数组和的值) //最大子数组和 public int maxSubArray(int[] nums) { if(nums.l原创 2020-11-29 15:34:48 · 135 阅读 · 0 评论 -
Leetcode 41-50刷题笔记(非困难题目)
46.全排列 全排列的概念我们在高中就学习过了,就题目所给的[1,2,3]三个数的全排列我们都知道一共有3 * 2 = 6个。 简单点就是第一位有3种选择,第二位有2种选择,第三位只有1中选择 ,所以是3 * 2 * 1 = 6。 根据上面我们可以思考得到,其实就是针对每一位的放置需要进行特殊的考虑。 所以该题的话,我们可以采用回溯算法,通过更改对应位置(第一位,第二位。。。)的元素并添加到list中,并且递归到下一位(此时可选元素会 - 1),这样的方式完成该题目 //全排列 public原创 2020-11-28 16:50:03 · 138 阅读 · 0 评论 -
Leetcode31-40刷题笔记(非困难题目)
33.搜索旋转排序数组 一看到这种排序数组 + 搜索的题目,我们应当直接联想到二分查找(专门针对于有序的Logn快速查找)。 二分查找基本思路就是通过有序性使得每次搜索都可以丢弃一半的元素,从而达到高效的搜索策略。 但是这道题有点区别在于,虽说他是有序的,但是他是经过了一定的旋转,所以导致不是完全的有序,应该说是一种部分的有序。 我们在进行二分查找的时候,将数组一分为二以后,一定会有一半是完全有序,一半是部分有序(也可能刚好完全有序)。 例如: 4,5,6,7,0,1,2 left = 0 right =原创 2020-11-27 17:33:59 · 342 阅读 · 0 评论 -
Leetcode 11-20刷题笔记(非困难题目)
11.盛最多水的容器 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且 n 的值至少为 2。 解题思路: 本题针对这种有两条边界的问题,一般都会想到使用双指针方法。 主要的算法考虑好后,那么就就需要针对问题进行判断如何让指针进行移动。 这里因为我们需要求的是最大的盛水量,然后该题原创 2020-10-09 18:20:52 · 630 阅读 · 0 评论 -
Leetcode 1-10刷题笔记(非困难题目)
1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解题思路: 1.暴力枚举,不做介绍,时间复杂度O(N^2) 2.hash运算,也是一种分治法思想,将两数之和的运算可以拆分成在选原创 2020-10-08 18:55:58 · 263 阅读 · 0 评论
分享