
Leetcode
刷题过程中的总结以及一些走过的坑
一叶-小舟
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素分析:分两种情况。p的最后一个字符不是*,这种情况比较好处理,如果是 . 就一定没问题因为可以匹配任意的字符,或者s[i - 1] == p[j - 1],这时就看前 i-1和 j-1的情况。第二种情况是最后一个字符是‘’,可能是匹配零个字符,这时候f[i][j] = f[i][j - 2] 。或者匹配多个字符这时候 f[i][j] = f[原创 2020-05-29 18:22:15 · 244 阅读 · 0 评论 -
股票问题Ⅳ
给定数组 prices, 其中第 i 个元素代表某只股票在第 i 天第价格.你最多可以完成 k 笔交易. 问最大的利润是多少?思路:这个与Ⅲ是类似的, 就是将只能交易2次,变成了可以交易k次。思路是一样,有2k + 1种情况。然后我们也是分别列举就可以了。需要注意的是,当 k 大于数组长度的一半时,就可以转为普通的不计次数的情况来进行操作。class Solution { public int maxProfit(int k, int[] prices) { int n = p原创 2020-05-25 22:32:30 · 152 阅读 · 0 评论 -
连续的子数组和
给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。思路1: 这个题我们可以直接暴力的做,先用一个sum数组来记录前i项的和,之后直接进行暴力的解答,求出每个子数组的和,然后判断是否满足是k的倍数,同时要保证长度大于等于2. 这里有一个特殊情况,即当k为0的时候,0是不能作为除数的,因此我们要进行特别的判断。思路2:我们可以使用一个Map来进行存储信息,将前 i 项和对k取余数的结果给原创 2020-05-21 23:08:29 · 617 阅读 · 0 评论 -
152.乘积最大的子序列
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。思路:对于以 i 结尾的子数组,如果 arr [i] 是正数,最大的连续子数组应该是乘上 i - 1位置的最大数或者其本身,如果 i 是负数,最大的连续子数组应该是乘上 i - 1 位置的最小数或者其本身。因此我们需要两个数组来保存变量,一个保存最大值,另外一个保存最小值。class Solution { public int maxProduct(int[] nums)原创 2020-05-19 15:43:56 · 111 阅读 · 0 评论 -
搜索二叉树
判断一棵树是否为搜索二叉树搜索二叉树的特点是当前节点的值大于左子树的值,小于右子树的值。即中序遍历的结果为升序。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { pu原创 2020-05-13 17:18:15 · 125 阅读 · 0 评论 -
1025.除数博弈
爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。思路:这是一个偶数必赢的游戏。倒数第二个数为2的时候,爱丽丝选择1,鲍勃就无法操作了。因此只要爱丽斯保证给鲍原创 2020-05-12 21:59:05 · 129 阅读 · 0 评论 -
爬楼梯升级版
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007这题是之前每次可以爬两层的升级版很明显若到达第 i 阶,可能的结果是从 i - 3, i - 2, i - 1,这三层台阶过来的,因此我们只需要将这三种情况的可能加起来就好了。还有就是我们需要开一个long数组,否则会发生越界。class Solution { public int waysToStep(int n) {原创 2020-05-12 21:17:56 · 776 阅读 · 0 评论 -
122.买卖股票的最佳时机Ⅱ
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。思路:我们一定是在低价格的时候买入股票,然后在高价格的时候卖出去,如果prices[i - 1]的值大于prices[i]的值,那么我们是不会选择prices[i-1]的,...原创 2020-05-08 11:03:31 · 143 阅读 · 0 评论 -
121.买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。思路:这题里只允许买卖股票一次,因此要此想获得最大的利润,我们一定是在历史最低价格的时候来进行买卖的。如果在第i天卖出股票,那么我们一定在i-1天中的最低价格买入才能够过得最大的利润。class ...原创 2020-05-08 10:46:13 · 79 阅读 · 0 评论 -
70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。思路:这道题与斐波那契数列是一道题,要想到达n,可以是从n-2或者n-1这两层到达的,因此是一样的。class Solution { public int climbStairs(int n) { if(n == 0)re...原创 2020-05-08 10:09:11 · 92 阅读 · 0 评论 -
509.斐波那契数列
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.给定 N,计算 F(N)。思路:可以进行暴力递归,遇到1或者2时返回1,还可以用一个一维的数组来进行存储前边的值,然后后面的值就直接计算...原创 2020-05-08 09:59:02 · 136 阅读 · 0 评论 -
最大子序和
给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。思路:动态规划。要求最大和可知,如果前面的i-1个元素和为负数则应该舍弃不要,如果大于0,则前面的和加上当前的数。class Solution { public int maxSubArray(int[] nums) { int sum = 0; int ...原创 2020-05-03 09:22:56 · 95 阅读 · 0 评论 -
长度最小的子数组
给定一个含n个正整数的数组和一个正整数s,找出该数组中满足其和>=s的长度最小的连续子数组,并返回其长度,如果不存在符合条件的连续子数组,就返回0。思路:这题也是一个关于滑动窗口的题。这题是找出其中满足大于等于的长度,与只等于的解法稍有不同。因为全是正整数,因此我们在向后移动的过程中,sum是一只增大的,当我们找到一个符合条件的子数组了,这时我们就将最左边的那个元素给删去,一直重复删除的操...原创 2020-05-02 22:23:40 · 233 阅读 · 0 评论 -
无重复字符的最长子串
给定一个字符串,找出其中不含有重复字符的最长子串长度。思路:这是一个滑动窗口的题目。设置两个两个指针来进行操作。一个代表左边界,一个代表右边界。左边界每次移动一个位置,找到这个左边界所包含的最长子串。然后在继续左边界。`class Solution { public int lengthOfLongestSubstring(String s) { if(s == n...原创 2020-05-02 21:43:35 · 158 阅读 · 0 评论 -
925. 长按键入
你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c时,按键可能会被长按,而字符可能会被输入1次或多次。检查键盘输入的字符typed,如果它对应的可能是你的朋友的名字(其中一些字符可能会被长按),那么就返回True。思路:该题使用了双指针的思想。考虑题意是某个字符可以长按而不是可以按错字符,出现名字中没有的字符,这样是错误的。我们首先判断键入的第一个字符,要是不相等的话说明是错的就没有...原创 2020-05-01 11:01:56 · 99 阅读 · 0 评论 -
21. 合并两个有序的链表
将两个升序链表合并为一个新的升序链表并返回。思路: 因为链表是有序的,我们分别遍历两个链表,如果l1的值大于l2的值就把l2当前节点加入到我们新建的节点中去,然后l2向后移动,否则的话就将l1的当前节点加入进去,l1向后移动。一般合并数组的操作,我们都需要建立空的头结点,方便后面我们可以返回链表的头。/** * Definition for singly-linked list. * p...原创 2020-05-01 10:36:59 · 80 阅读 · 0 评论 -
167. 两数之和 Ⅱ - 输入有序数组
给定一个已按照升序排列的有序数组,找到两个数是的他们相加之和等于目标数。由于数组是已经排好序的,可以利用双指针来进行操作。一个指针位于最后,一个指针最开始的位置,如果加起来大于目标值最后的指针就向前移动,如果加起来小于目标值,前边的指针就向后移动。class Solution { public int[] twoSum(int[] numbers, int target) { ...原创 2020-04-30 21:34:43 · 109 阅读 · 0 评论 -
66.加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。思路:有两种情况为9和不为9的情况。当为9的时候,继续看前一位,直到加一不为10。若是99、999这种我们要加数组的长度加一然后将第0位的数初始化位1。class Solution { public int[]...原创 2020-04-03 22:21:51 · 81 阅读 · 0 评论 -
350. 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。思路1:排序完成之后进行遍历。Arrays.copyOfRange(int[] arr,int from,int to)从from到to包含from不包含toclass Solution { public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(num...原创 2020-04-03 21:51:26 · 97 阅读 · 0 评论 -
LeetCode 136 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。思路1:暴力法。先将数组给进行排序,然后依次看当前数字是否与后面的数字相同,遇到不同的就返回。class Solution { public int singleNumber(int[] nums) { Arrays.sort(nums); for(in...原创 2020-04-03 19:11:32 · 100 阅读 · 0 评论