- 博客(65)
- 资源 (1)
- 收藏
- 关注
原创 dfs模版题:力扣79单词搜索
题目:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。思路:这道题是dfs的模版题,在进行路径选择的时候,需要标记下已经走过的,在进行回溯的时候,需要回复。class Solution { boolean res = false; boolean[][] visited; int m; int n; public
2020-07-31 23:21:46 206
原创 leetcode42.接雨水---Java
题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6思路:这道题我的思路是使用单调栈来进行求解,栈中存放的是墙的下标。当current指向的墙比当前栈顶的墙低时,说明可以存水,即压入栈;如果比当前栈顶的墙高,则栈中元素进行弹出,并计算积攒的雨水量。先判断左右墙的高度,取最低的://确定左右最低高度int min = Math.min(height[stack.peek(
2020-07-29 13:20:04 135
原创 leetcode524.通过删除字母匹配到字典里最长的单词
难度:中等题目:给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。思路:首先先读懂题目,题目的意思是先在字符串字典(list数组)先判断每一个位置的字符串可不可以通过给定的字符串进行删除某些字符得到,如果能则表示符合要求,那么之后需要在符合要求的字符串中找出长度最长并且字典顺序最小的。对于字典顺序最小的理解是:a.compareTo(b)>0,说明a的字典
2020-07-28 12:44:54 276
原创 判断链表是否存在环---Java
题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。思路1:利用set集合遍历给定的链表,当set.contains(head)等于true时,有遍历过的元素,说明链表中存在环。/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode ne
2020-07-27 15:35:11 159
原创 双指针 680.验证回文串ll
题目:给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: “aba”输出: True示例 2:输入: “abca”输出: True解释: 你可以删除c字符。思路:可以删除一次,因此,遇到不一样的字符时,我们需要判断删除左边一个剩下的是不是回文串和删除右边的一个剩下的是不是回文串。使用双指针。class Solution { public boolean validPalindrome(String s) { int left = 0
2020-07-27 10:51:58 106
原创 leetcode 345. 反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。//元音字母:a e i o uclass Solution { public String reverseVowels(String s) { char[] chr = s.toCharArray(); int left = 0; int right = chr.length-1; String s1 = "aeiouAEIOU"; while(left &
2020-07-27 00:01:17 88
原创 leetcode633. 平方数之和
题目:给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。示例1:输入: 5输出: True解释: 1 * 1 + 2 * 2 = 5示例2:输入: 3输出: False思路:双指针class Solution { public boolean judgeSquareSum(int c) { int left = 0; int right = (int)Math.sqrt(c); while(l
2020-07-26 14:34:40 171
原创 剑指offer43.1~n整数中1出现的次数
题目:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例1:输入:n = 12输出:5示例2:输入:n = 13输出:6思路:借鉴题解区一位大佬的思路:class Solution { public int countDigitOne(int n) { return f(n); } public int f(int n){
2020-07-26 14:11:12 124
原创 树的最近公共祖先
1.二叉搜索树思路:二叉搜索树由于是排过序的,所以我们可以先判断当前结点和两个结点的大小,在做判断。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public T
2020-07-25 10:18:50 152
原创 剑指 Offer 65. 不用加减乘除做加法
无进位的运算:0001+0010=0011;可以用异或来运算。有进位的运算:需要记录进位,在用进位进行yu运算。class Solution { public int add(int a, int b) { while( b != 0){ int c =(a&b)<<1;//记录进位的 a=a^b;//非进位的和 b=c;//进位 } return a;
2020-07-24 19:59:39 85
原创 剑指offer14-l.剪绳子
题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。class Solution { public int cuttingRope(int n) { int[] dp = new int[n+1];
2020-07-24 17:36:20 80
原创 剑指 Offer 57 - II. 和为s的连续正数序列
题目:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。class Solution { public int[][] findContinuousSequence(int target) { List<int[]> list = new ArrayList<int[]>(); int left =1; int rig
2020-07-24 16:37:34 85
原创 剑指 Offer 46. 把数字翻译成字符串
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路:主要看第i位数和第i-1位数,能不能组合也就是是不是小于25;如果不能组合那么,单独算i也就和dp[i-1]是一样的,因为每一个数都得翻译。如果能够组合,则需要将组合后的和单独的一起加起来,也就是两部分,先算组合的,将组合的部分看成一个整体,即dp[i-2];再算单
2020-07-24 13:10:55 83
原创 剑指 Offer 66. 构建乘积数组
题目:给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。按照题意可以知道,b[i]位置的元素对应的a[i] =1;因此我们的第一种思路就是先把a[i]==1;然后遍历进行乘积。但是这样跑出来以后,测试案例最后一个会通不过,时间超时。因此,我们换一个思路,上面这个思路,出现了重复计算没有利用之前计算的信息。我们可以先计算下三角的值,然后在计算上三角的值。具体
2020-07-20 11:15:27 57
原创 剑指 Offer 48. 最长不含重复字符的子字符串(重要)
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路:用map存储当前位置的元素和位置,当遇到相同元素时,start更新为map中存储的元素的位置,然后put一下更新map中的新值。后面在遇到相同的就继续更新start为上一次出现的位置,同时将map中的值进行更新。初始值:start的初始值为-1。需要注意的是,更新start的值时,需要取最大的那
2020-07-19 15:07:40 142
原创 剑指 Offer 47. 礼物的最大价值
题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?思路1:使用dfs做,结果超时。class Solution { int max= 0; public int maxValue(int[][] grid) { dfs(grid,0,0,0); return
2020-07-19 11:47:19 91
原创 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。思路:排序数组的解法其实一般使用二分、双指针比较多,但是对于这道题,所有数字都是唯一而且是递增排列,因此,我们可以直接比较这个数组的值和这个位置即可。另外需要搞清楚题目的条件,我因为没理解题意,边界出了问题。题目的意思是,咱们有一个数组,长度就是n,数组是从0-n-1依次排的,个数是n个;那么题目的意思就是在0到n的中有且只有一个数字
2020-07-18 15:03:37 184
原创 剑指 Offer 63. 股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路;这道题目使用动态规划做,第一次看题的时候一直在想什么时候买,什么时候卖,题目要求是要利润最大,因此直接在价格i天前最低的时候买就行,接下来就是计算每一个卖出的利润(当天的价格减去前面最低的价格)。class Solution { public int maxProfit(int[] prices) { //动态规划,初试值,dp[0] = 0; //状态转移方
2020-07-18 14:32:51 81
原创 剑指offer59-II.队列的最大值
题目:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1思路;这道题和之前求min那个思路差不多,而且和上一道题也差不多。就是用递减。这里我们回顾一下单点栈,这个是用来找后面第一个比自身大的数时用到了单点栈,用一个map存数值和位置。在这里我们使用单调队列,递减的,来快速找出队列中最大的值(队头)。注意:在进行队
2020-07-18 13:05:53 105
原创 剑指offer59-I.滑动窗口的最大值
题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。思路:我刚开始是使用的是优先队列做,写完之后有4个测试案例没有通过,后来发现,我在删除队列元素的时候只考虑了当删除的数组的元素等于队列栈顶元素时,就删除队列的元素;这样考虑会出现这样的问题,比如这个测试案例:[9,10,9,-7,-4,-8,2,-6]5当前面出现一样的元素时,只会删除一个最大的,因此后面还是会有最大的;所以我们需要同时在队列中删除数组中删除的那个元素。class Solution { int
2020-07-18 11:30:14 228
原创 剑指offer41.数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例一:输入:[“M
2020-07-17 14:37:03 176
原创 给定有字母和数字的字符串输出最大的16进制
输出十六进制,首先判断是否为数字,Character.isDigit()。转成16进制:Integer.parseInt( , 16) public int solve(String s){ int begin = 0; int end = 0; int res = 0; for(int i=0;i<s.length();i++){ if(Character.isDigit(s.charAt(i)) ||
2020-07-17 12:39:04 364
原创 剑指offer62.圆圈中最后剩下的数字
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2方法一:这是著名的约瑟夫环问题,可以使用ArrayList进行纯暴力解法。假设当前需要删除的位置为index,则下一个要删除的
2020-07-17 11:42:27 74
原创 剑指offer61.扑克牌中的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True思路:这道题我没有其他方法,因为就5个数,数据量不大,所以直接用的数学分情况讨论。首先,由题意可知,0可以替代任何数,因此,我们先找出0的个数,当个数大于4时,是一定可以凑成顺子的;其次,开始讨
2020-07-16 21:53:32 70
原创 数据库常见的优化
1.总是有不止一种方法编写同一条select语句,应该多使用联结、并、子查询等,找出最佳方法2.绝不要检索比需求还要多的数据3.导入数据时,关闭自动提交。4.必须索引数据库表以改善数据检索的性能5.LIKE很慢后序继续补充...
2020-07-16 16:06:17 83
原创 剑指offer 57.和为s的两个数
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]这道题用暴力解是通过不了的,直接超时;我的思路是:使用双指针的解法,定义一个left指针和right指针;由于给的是递增的
2020-07-16 14:14:42 79
原创 剑指offer49.丑数
题目:我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。本题链接:https://leetcode-cn.com/problems/chou-shu-lcof/solution/chou-shu-ii-qing-xi-de-tui-dao-si-lu-by-mrsate/class Solution { public int nthUglyNumber(int n) { int[] dp = new int[n];
2020-07-16 13:36:19 132
原创 剑指offer17.打印从1到最大n位数
题目:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。思路:做的这几道数学类的题,都比较简单,这道题也是一样,先是根据位数,确定下范围,比如n=1,则res=10,所以数的范围就在1-9之间,最后建立数组打印即可。class Solution { public int[] printNumbers(int n) { int res = 1; for(int i=1;i<=n;i+
2020-07-16 11:31:40 203
原创 剑指offer16.数值的整数次方 ---剑指64,求1+2+3+4...---剑指15.二进制中1的个数
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25思路:这道题使用快速幂的解法来做主要是每次判断b是否为0,为0的话就参加计算,x每次继续变化。class Solution { p
2020-07-16 09:59:17 106
原创 剑指 Offer 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。动态规划:class Solution { public int fib(int n)
2020-07-15 23:55:31 107
原创 剑指 Offer 13. 机器人的运动范围
题目链接:https://leetcode-cn.com/submissions/detail/88072227/题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人
2020-07-15 16:46:13 138
原创 剑指offer12.矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。这道题和之前写过一道走迷宫的题很相似,都是从一个点开始走,走过之后就将这个位置设置为已走过,当路走不通时,需要回溯回来,同时将当前格子的值恢复为原来的。class Solution { pu
2020-07-15 14:03:02 78
原创 剑指offer31.栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。思路:这道题就是判断按着一个数组进行进栈操作,判断另一个数是否可能是出栈操作。因此,我们可以建立一个模拟栈,模拟进栈操作,当栈顶元素等于出栈数组的元素时,进行出栈(就是根据出栈数组,进行出栈操作),最后只需要看s
2020-07-15 12:40:16 165
原创 剑指offer30.包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。这种题有很多,比如用两个栈实现队列,和用队列实现栈等等,这道题使用两个栈,需要注意的点有返回查看最小的元素时只是查看并不是删除,其次,pop元素时,需要注意下是不是和min_stack栈顶的元素是不是相等,相等的话必须要也要一起删除。class MinStack { Stack<Integer> stack; Stack&
2020-07-14 17:22:03 65
原创 剑指offer09.用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]class CQueue { Stack<Integer> s1;
2020-07-14 16:54:44 71
原创 剑指offer37.序列化和反序列化二叉树(详解)
难度:困难链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/submissions/题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为
2020-07-14 15:31:38 298 1
原创 剑指offer 28.对称二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。这道题的思路是用递归,一层一层的进行判断;先判断当前这两个点是否满足要求,然后在递归判断下一层。先判断root是否为空,这边需要注意一点是,空的树也是对称的,没办法,测试案例就是写的true。然后递归的判断root的left节点和right节点。代码注释就不写了,比较好理解,找到一个不满足条件的就直接返回false/** * Definition for a binary tree node. * p
2020-07-14 10:32:49 103
原创 剑指offer54.二叉树搜索树的第k大节点
题目:给定一棵二叉搜索树,请找出其中第k大的节点。这道题是一道简单题,刚开始写的时候没看到是二叉搜索树,所以当成二叉树来做了,代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solu
2020-07-14 10:13:17 183 1
原创 JVM知识点小记
JVM思维导图常见面试题:请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取,怎么分析Dump文件?谈谈JVM中类加载器,你的认识?1.JVM的位置2.JVM的体系结构本地方法接口:JNIJava栈、本地方法栈、程序计数器不会产生垃圾。所谓的JVM调优99%的情况下是调方法区和堆这个区域(大部分是在调堆)。3.类加载器类加载器的作用:加载clas
2020-07-14 00:01:25 239
原创 剑指offer 55 -II平衡二叉树
leetcode地址:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例:方式一:先序遍历(从顶至下)/** * Definition for a binary tree n
2020-07-13 16:09:22 228
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人