自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 【LeetCode-10】10. 正则表达式匹配

10. 正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。解题思路1:递归回溯递归回溯,其实就是将所有可能的情况全部都试一遍实现函数isMath(String s, String p)

2020-05-31 16:00:37 267

原创 【LeetCode-198】198. 打家劫舍

198. 打家劫舍题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。解题思路:动态规划必看详细思路讲解 + 题目变形class Solution { public int rob(int[] nums) { if(nums

2020-05-29 11:16:32 137

原创 【LeetCode-516】516.最长回文子序列(给定一个字符串s,找到其中最长的回文子序列,并返回该序列的长度。可以假设s的最大长度为1000。)

516.最长回文子序列给定一个字符串s,找到其中最长的回文子序列,并返回该序列的长度。可以假设s的最大长度为1000。解题思路:动态规划超赞的解题思路dp 数组的定义是:在子串 s[i…j] 中,最长回文子序列的长度为 dp[i][j]。class Solution { public int longestPalindromeSubseq(String s) { if(s == null || s.length() == 0) { re

2020-05-28 22:10:38 1506

原创 【LeetCode-1143】1143.最长公共子序列

最长公共子序列LCS给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。动态规划-O(len1*len2)class So

2020-05-28 21:07:39 185

原创 【LeetCode-887】887.扔鸡蛋(动态规划)

扔鸡蛋问题参考代码

2020-05-28 20:41:41 116

原创 【LeetCode-72】72.编辑距离(给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入)

编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符动态规划思路参考1思路学习2class Solution { public int minDistance(String word1, String word2) { int m = word1.length(); int n = word2.length()

2020-05-28 17:07:00 2985 2

原创 【LeetCode-698】698.划分为k个相等的子集(dfs+回溯)

划分为k个相等的子集题目描述给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。dfs+回溯整体就是一个暴力的解法,先算出子集的和是多少,并抽象成k个桶,每个桶的值是子集的和。然后尝试所有不同的组合(即放数到桶中),如果存在一种组合可以使每个桶都正好放下,那么返回可以。如果不存在,返回不可以。class Solution { public boolean canPartitionKSubsets(int[] nums, int k)

2020-05-28 14:53:23 375

原创 【LeetCode-416】416.分割等和子集

分割等和子集题目描述给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200方法:动态规划之0-1背包问题必看的解题思路class Solution { public boolean canPartition(int[] nums) { if(nums == null || nums.length == 0) { return false;

2020-05-28 14:07:45 247

原创 【LeetCode-738】738.单调递增的数字(给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。)

单调递增的数字题目描述给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)class Solution { /** * 思路: * 从右向左扫描数字,若发现当前数字比其左边一位(较高位)小, * 则把其左边一位数字减1,并将该位及其右边的所有位改成9 */ public static

2020-05-26 20:36:03 1209

原创 【LeetCode-402】402.移除k位数字(给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。)

移除k位数字给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。思路:单调栈(贪心+栈)class Solution { /* 单调栈的另一个应用,思想为删除靠前的较大的数能够使得最后的数值最小。 构建递增栈,若当前数字小于栈顶元素,则在满足待删减字符数不为0的情况下,栈顶元素出栈,当前数字入栈。 */ public String removeKdigits(String num, int k) { /

2020-05-26 20:29:45 2552

原创 【LeetCode-92】92.翻转链表II(反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。)

翻转链表II反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode reverseB

2020-05-26 19:14:58 265

原创 【LeetCode-990】990.等式方程的可满足性

等式方程的可满足性题目描述给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。解题思路:并查集class Solution { class UF { // 记录连通分量个数 private

2020-05-26 15:20:27 198

原创 【并查集】并查集(Union-Find)算法框架

并查集(Union-Find)算法框架class UF { // 记录连通分量个数 private int count; // 存储若干棵树 private int[] parent; // 记录树的“重量” private int[] size; public UF(int n) { this.count = n; parent = new int[n]; size = new int[n];

2020-05-26 15:02:12 270

原创 【LeetCode-130】130.被包围的区域

被包围的区域题目描述给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。方法 一:dfs+递归class Solution { public void solve(cha

2020-05-26 14:59:23 300

原创 【LeetCode-111】111.二叉树的最小深度

二叉树的最小深度题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。思路1:DFS+递归注意:修改求二叉树的最大深度(树高)的代码,求二叉树的最小深度同求最大深度相反,就是将 Math.max() 换成 Math.min()/** * Definition for a binary tree node. * public class TreeNode { * int val; * Tre

2020-05-24 11:27:03 170

原创 算法刷题套路+答题框架总结

BFS 算法框架套路详解双指针技巧总结滑动窗口解题套路总结二分查找解题套路框架回溯算法解题套路框架动态规划答疑篇动态规划解题套路框架摘自:推荐刷算法题必看+超级有用

2020-05-23 21:43:51 483

转载 双指针技巧总结

双指针技巧总结一、快慢指针的常见算法1、判定链表中是否含有环经典解法就是用两个指针,一个跑得快,一个跑得慢。如果不含有环,跑得快的那个指针最终会遇到 null,说明链表不含环;如果含有环,快指针最终会超慢指针一圈,和慢指针相遇,说明链表含有环。boolean hasCycle(ListNode head) { ListNode fast, slow; fast = slow = head; while (fast != null && fast.next !=

2020-05-23 21:33:43 288

原创 【LeetCode-3】3.无重复字符的最长子串

无重复字符的最长子串题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。滑动窗口+双指针+哈希修改滑动窗口模板:class Solution { public int lengthOfLongestSubstring(String s) { int maxLen = 0; if(s == null || s.length() == 0) { return maxLen; }

2020-05-23 21:14:17 112

原创 【LeetCode-438】438.找到字符串中所有字母异位词

找到字符串中所有字母异位词题目描述给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。滑动窗口+双指针+哈希class Solution { public List<Integer> findAnagrams(String s, String p) {

2020-05-23 21:02:00 175

原创 【LeetCode-567】567.字符串的排列

字符串的排列题目描述给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。示例1:输入: s1 = “ab” s2 = “eidbaooo”输出: True解释: s2 包含 s1 的排列之一 (“ba”).示例2:输入: s1= “ab” s2 = “eidboaoo”输出: False注意:输入的字符串只包含小写字母两个字符串的长度都在 [1, 10,000] 之间滑动窗口+哈希+双指针clas

2020-05-23 20:24:57 157

原创 【LeetCode-76】76.最小覆盖子串(滑动窗口+哈希+双指针)

最小覆盖子串题目描述给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = “ADOBECODEBANC”, T = “ABC”输出: “BANC”说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。class Solution { public String minWindow(String s, String t) { if(t.length() =

2020-05-23 19:10:44 155

原创 二分查找(区分边界情况)

最基本的二分查找算法:int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else

2020-05-23 17:05:10 140

原创 【LeetCode-518】518.零钱兑换II(动态规划)

零钱兑换II题目描述给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amount = 3, coins = [2]输出: 0解释: 只用面额2的硬币不能凑成总金额3。示例 3:输入: amount = 10, coins =

2020-05-23 14:31:42 223

原创 【LeetCode-322】322.零钱兑换(动态规划解决)

零钱兑换题目描述给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1说明:你可以认为每种硬币的数量是无限的。最好理解:动态规划解决/*使用第一个测试用例步骤1.f(n)只

2020-05-23 13:11:52 559

原创 【LeetCode-99】99.恢复二叉搜索树

恢复二叉搜索树题目描述二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。方法一:中序遍历O(n)中序遍历过程中,记录错误两个错误排序节点,最后进行交换递归遍历的空间复杂度是O(h),h为树度高度,本质上还是O(n)的/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode righ

2020-05-21 16:33:14 181

原创 【LeetCode-105】105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树题目描述递归+map/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public TreeNode buildTree(

2020-05-21 15:21:12 90

原创 【LeetCode-124】124.二叉树中的最大路径和

二叉树中的最大路径和题目描述给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。后序遍历/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val

2020-05-21 14:48:30 154

原创 【剑指Offer】不用加减乘除做加法

不用加减乘除做加法题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:位运算/*思路:位运算两个数异或:相当于每一位相加,而不考虑进位;两个数相与,并左移一位:相当于求得进位;将上述两步的结果相加*/public class Solution { public int Add(int num1,int num2) { while( num2 != 0 ){ int sum = num1 ^ num2

2020-05-19 13:54:51 75

原创 【剑指Offer】求1+2+3+...+n

求1+2+3+…+n题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。public class Solution { /* 解题思路: 1.需利用逻辑与的短路特性实现递归终止。 2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0; 3.当n>0时,执行sum

2020-05-19 13:46:39 98

原创 【剑指Offer】孩子们的游戏(圆圈中最后剩下的数)

孩子们的游戏(圆圈中最后剩下的数)题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!

2020-05-19 13:29:47 116

原创 【剑指Offer】扑克牌顺子

扑克牌顺子题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育

2020-05-19 12:59:20 98

原创 添加字符(牛牛手里有一个字符串A,羊羊的手里有一个字符串B,B的长度大于等于A,所以牛牛想把A串变得和B串一样长,这样羊羊就愿意和牛牛一起玩了。)

添加字符题目描述牛牛手里有一个字符串A,羊羊的手里有一个字符串B,B的长度大于等于A,所以牛牛想把A串变得和B串一样长,这样羊羊就愿意和牛牛一起玩了。而且A的长度增加到和B串一样长的时候,对应的每一位相等的越多,羊羊就越喜欢。比如"abc"和"abd"对应相等的位数为2,为前两位。牛牛可以在A的开头或者结尾添加任意字符,使得长度和B一样。现在问牛牛对A串添加完字符之后,不相等的位数最少有多少位?输入描述:第一行为字符串A,第二行为字符串B,A的场地小于等于B的长度,B的长度小于等于50.字符均为

2020-05-19 12:56:34 755

原创 【剑指Offer】翻转单词顺序列

翻转单词顺序列题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?参考/* 算法思想:先翻转整个句子,然后,依次翻转每个单词。 依据空格来确定单词的起始和终止位置*

2020-05-19 11:35:57 96

原创 【剑指Offer】左旋转字符串

左旋转字符串题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!方法一:直接拼接public class Solution { public String LeftRotateString(String str,int n) { i

2020-05-19 11:28:13 90

原创 【剑指Offer】和为S的两个数(有序数组)

和为S的两个数题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。参考import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { //左右夹逼

2020-05-19 11:07:55 119

原创 【剑指Offer】和为s的连续正数序列

和为s的连续正数序列题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列(等差数列)。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序解题思路:双指针+滑

2020-05-19 10:30:29 90

原创 【剑指Offer】数组中只出现一次的数

数组中只出现一次的数题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。方法一: 使用HashMap直接计数法暴力法:map保存数组元素的出现次数+遍历map方法二:使用HashSet判断元素是否重复一种简单的思路,可以想到用HashSet这种数据结构来存,重复的就立即剔除,剩下的就是不重复的两个数字,将其取出即可。链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d66

2020-05-19 10:03:51 83

原创 【剑指Offer】二叉平衡树(判断一棵二叉树是否是平衡二叉树)

二叉平衡树(判断一棵二叉树是否是平衡二叉树)题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树判断子树是否平衡+求左右子树高度public class Solution { // 如果从下往上遍历,如果子树是平衡二叉树,则返回子树的高度; // 如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。 public boolean IsBalanced_Solution(TreeNode ro

2020-05-18 22:21:10 168

原创 【剑指Offer】数字在排序数组中出现的次数

数字在排序数组中出现的次数题目描述统计一个数字在排序数组中出现的次数。方法一:直接遍历,计数public class Solution { public int GetNumberOfK(int [] array , int k) { int count = 0; for(int i = 0; i < array.length; i++) { if(array[i] == k) { count++;

2020-05-18 21:37:30 92

原创 【剑指Offer】数组中的逆序对

数组中的逆序对题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size<=2*10^5示例1输入1,2,3,4,5,6,7,0输出7暴力法只能通

2020-05-18 21:13:58 176

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除