![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣
刹那永恒HB
看了不点赞,画个圈圈诅咒你!!!!!
展开
-
剑指Offer—刷题记录
栈用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )两个栈,一个栈用来插入、另一个用来删除,删除之前都要先判断stack.isEmpty(),栈是否为空。class CQueue { Stack<Integer> stackA; Stack<Integer> stackB;原创 2022-01-08 17:55:09 · 843 阅读 · 0 评论 -
力扣刷题32
剑指 Offer II 009. 乘积小于 K 的子数组给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。滑动窗口首先外层循环判断右边界有没有走到头其次内层循环判断乘积是否大于等于k,如果满足,说明这个滑动窗口不满足题目条件,需要将左边界缩小,因为元素都是正整数,所以缩小边界,元素个数减少,那么乘积就会减小,直到乘积小于k,如果判断条件右边界小于左边界,那么以长度为贡献值赋予ansclass Solution { public int numSub原创 2021-12-24 10:27:45 · 270 阅读 · 0 评论 -
力扣刷题28
剑指 Offer II 016. 不含重复字符的最长子字符串给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。利用滑动窗口+hashset当set中包含重复项时,窗口的left++,缩小一直到没有重复项在窗口中,没有重复项的情况下,right++,窗口增大,一直到n结束,每次外层循环都维护长度最大值,取上一次的max和当前的right-left+1class Solution { public int lengthOfLongestSubstring(String原创 2021-12-23 14:26:03 · 150 阅读 · 0 评论 -
力扣刷题28
剑指 Offer 57. 和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可Map集合的containsKey函数二分查找法,每次只拿left和right的元素进行判断Map集合class Solution { public int[] twoSum(int[] nums, int target) { // Map集合 Map<Integer,Integer>原创 2021-12-23 12:49:44 · 179 阅读 · 0 评论 -
力扣刷题27
剑指 Offer 68 - II. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]最近的公共祖先:从root开始找,如果从左子树找到p、从右子树找到q说明root节点就是公共祖先先把特殊原创 2021-12-23 12:20:54 · 181 阅读 · 0 评论 -
力扣刷题26
剑指 Offer II 005. 单词长度的最大乘积给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。将任意两个字符串转为字符数组,然后新建一个字符数组26个空间大小,然后统计字符串的字符有没有出现过,第一个字符串中的字符如果出现过,那么对应的位置word-’a‘,就是对应的0,1,。。。的索引下表元素置为1,然后遍历第二个字符串,如果发现有原创 2021-12-22 23:46:47 · 134 阅读 · 0 评论 -
力扣刷题25
剑指 Offer II 006. 排序数组中两个数字之和给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。利用Map集合,将数组的值原创 2021-12-22 23:15:10 · 73 阅读 · 0 评论 -
力扣刷题23
剑指 Offer 56 - II. 数组中数字出现的次数 II在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。还是利用Map的键值对class Solution { public int singleNumber(int[] nums) { Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.l原创 2021-12-22 23:09:02 · 53 阅读 · 0 评论 -
力扣刷题24
剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。利用集合,集合是不重复的元素,如果循环遍历的过程中,发现集合中有重复元素,则删除该集合中这个元素之后就for增强num,新建一个数组,然后把set依次放入该数组中class Solution { public int[] singleNumbers(int[] nums) {原创 2021-12-22 21:10:00 · 73 阅读 · 0 评论 -
力扣刷题23
剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。集合,利用集合的不重复元素机制,集合不会插入重复元素如果有重复元素,add为false如果false,则返回遍历完之后,没有找到重复,就返回-1class Solution { public int findRepeatNumber(int原创 2021-12-22 20:56:19 · 179 阅读 · 0 评论 -
力扣刷题22
剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )一个栈用插入一个栈用删除删除比较特殊:当删除栈空时,需要插入栈中的所有元素都要先弹入删除栈中,弹出后,再进行删除操作,如果此时删除栈不为为空,则将栈中元素再进行弹出class CQueue { Stack<Integer&原创 2021-12-22 20:51:25 · 60 阅读 · 0 评论 -
力扣刷题20
有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。栈,首字符串个数为奇数,则false字符串个数为偶数,把它转换成字符数组,然后一个个遍历,遇到左符号,就压入栈,否则看看栈是否为空,因为接下来,要弹出栈如果遇到右符号,则把它和左符号进行并比较处理,满足条件就弹出栈,否则返回fasle,最后看栈中是否含有元素,没有就返回trueclass Solut.原创 2021-12-22 19:38:54 · 2941 阅读 · 0 评论 -
力扣刷题19
剑指 Offer 10- II. 青蛙跳台阶问题一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。最后一次即可跳1,也可以跳2,转移方程:fn=fn-1+fn-2边界条件:f0=1,f1=1,f2=2第一次:1、1、2、二次:1、2、3三次:2、3、5class Solution { public int numWays(int n)原创 2021-12-21 17:33:46 · 59 阅读 · 0 评论 -
力扣刷题18
剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。动态规划:转移方程:fn=fn-1+fn原创 2021-12-21 17:22:26 · 100 阅读 · 0 评论 -
力扣刷题17
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。哈希表键存储数组的元素,值存储索引然后依次遍历在寻找过程中存储元素可以提高效率如果target-nums[i]没出现在map中,则直接put进去,如果在map中,返回get对应的值,以及当前的索引class Solution {.原创 2021-12-21 11:34:19 · 59 阅读 · 0 评论 -
力扣刷题16
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。循环遍历n的前n个数,偶数去掉最低位,奇数是前一个偶数+1,就是加上最低位的1因为偶数的二进制是该数的一半,因此是右移一位class Solution { public int[] countBits(int n) { int[] bit=new int[n+1]; for(int i=0;i原创 2021-12-21 10:26:06 · 52 阅读 · 0 评论 -
力扣刷题15
剑指 Offer II 002. 二进制加法给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1 和 0。定义StringBuilder存放最终结果定义count作为进位数for循环遍历:初始值为两个字符串的最后一个字符,假设“10” “01”,total+=i>=0?a.charAt(i)-‘0’:0;total+=j>=0?b.charAt(j)-‘0’:0;这两行代表对应数字相加count代表进位数s原创 2021-12-21 10:04:29 · 68 阅读 · 0 评论 -
力扣刷题14
剑指 Offer II 001. 整数除法给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。将正负号标志位,另外运算,class Solution { public int divide(int a, int b) { //如果被除数是 if(a==Integer.MIN_VALUE&&b==-1){ return Integer.MAX_VALUE;原创 2021-12-21 09:26:04 · 51 阅读 · 0 评论 -
力扣刷题13
剑指 Offer 30. 包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top();原创 2021-12-20 23:52:26 · 412 阅读 · 0 评论 -
力扣刷题13
剑指 Offer 64. 求1+2+…+n求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。对于 A && B 这个表达式,如果 A 表达式返回 false,则不会执行B,如果||返回true,则不会执行B上述的表达式转换递归为:n=n+sum(n-1);class Solution { public int sumNums(int n) { boolean flag=n&原创 2021-12-19 23:20:23 · 51 阅读 · 0 评论 -
力扣刷题12
剑指 Offer 26. 树的子结构输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。递归:辅助函数;先判断其中一个树是否为空,为空直接false否则进入递归,1、两个·树直接进入辅助函数递归,判断两个树直接相同2、判断左右子树是否与另一个树相同,进入rec辅助递归判断/** * Definition for a binary tree node. * public class TreeNode {原创 2021-12-19 23:08:54 · 177 阅读 · 0 评论 -
力扣刷题11
根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。递归解析:终止条件: 当节点 rootroot 为空时(即越过叶节点),则返回 nullnull ;递推工作:初始化节点 tmptmp ,用于暂存 rootroot 的左子节点;开启递归 右子节点 mirrorTree(root.right)mirrorTree(root.right) ,并将返回值作为 rootroot 的 左子节点 。开启递归 左子节点 mirrorTree(tmp)mi原创 2021-12-19 22:50:19 · 194 阅读 · 0 评论 -
力扣刷题10
剑指 Offer 28. 对称的二叉树请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的对称的情况:左右子树同时为空则为对称左右子树有一个为空则为不对称左右子树同时存在 但值不同 则为不对称先判断树是否为空,为空直接true上述为对称的三种,递归的方式,首先需要递归结束条件,就是left和right为null时left和right的val不相等时跳出递归/** * Definition for a binary tree node. * p原创 2021-12-19 22:39:24 · 3174 阅读 · 0 评论 -
力扣刷题9
剑指 Offer 55 - I. 二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。初始化一个链表队列,然后判定如果root不为null,然后将其添加到queue中while循环判断如果queue不为空就让深度加1;for循环遍历每层的节点,可以不用创建一个临时节点,可以直接poll然后if判断如果当前节点的左右字节点不为空,则加入queue用于下一次循环最后while循环结束返回深度/** * De原创 2021-12-19 11:28:43 · 64 阅读 · 0 评论 -
力扣刷题8
剑指 Offer 32 - II. 从上到下打印二叉树 II从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。先定义链表用于存放节点,动态数组用于存放最外层判断root是否为空,不为空就将添加到queue然后循环当queue不为空定义一个内层的动态数组,然后for循环,循环的大小是这一层的节点数量然后循环体内定义一个临时节点用于取,然后将其值放入到临时数组中,接着判断temp的左右子节点是否为空,不为空就将其存放入queue,然后for循环结束,将内层动态数组存入到外原创 2021-12-19 11:04:38 · 55 阅读 · 0 评论 -
力扣刷题7
剑指 Offer 32 - III. 从上到下打印二叉树 III请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。先判断root是否为空不为空将其存放在queue先定义一个动态数组用于存放节点数值,一个队列,用链表实现,用于存放节点while循环判定queue是否为空,临时节点用于存放queue中poll元素然后将temp节点的值存放在动态数组中,接下来进行判断temp节点的左右子节点是否为空,不为原创 2021-12-19 10:49:31 · 187 阅读 · 0 评论 -
力扣刷题6
剑指 Offer 32 - III. 从上到下打印二叉树 III请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推idea:层序遍历,遍历结果添加到双端队列中,先定义内层的数据结构,使用链表或者队列都可以,最外层使用ArrayList,先判断root是否为空,不为空,添加到链表中然后进行循环判断,从队列头部删除元素,直到遇到null停止,里面定一个数组,用于存放每一层的节点值,以每个节点的左右子原创 2021-12-19 10:18:15 · 59 阅读 · 0 评论 -
力扣刷题5
验证回文串给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。直接调用各种API,先依次遍历字符串将字母和数字取出来,然后再创建一个stringbuilder对象,进行反转,toString后进行equals判断class Solution { public boolean isPalindrome(String s) { StringBuilder str=new StringBuilder(); int length=s.le.原创 2021-12-18 23:25:33 · 53 阅读 · 0 评论 -
力扣刷题4
回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 falseidea:先通过快慢指针找到中点,然后再通过反转链表反转后半部分,最后再比较两个链表值是否相等,最后可以还原一下/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * .原创 2021-12-18 23:02:48 · 228 阅读 · 0 评论 -
力扣刷题3
剑指 Offer 04. 二维数组中的查找在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。idea:把这个矩阵逆序旋转45度,当作一个树看,可以发现如果选择左下角点当作根节点的话,这是一个二叉搜索树,如果目标值与节点相比,大于节点值,说明应该往右找,right++,小于节点值,说明应该往左找,left–,直到找到该节点值,否则当left或者right越界就结束原创 2021-12-18 17:12:44 · 63 阅读 · 0 评论 -
力扣刷题2
反转链表 II给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。解题:初始化:先建立一个虚拟节点用于指向head,这个一是为了满足遍历时,索引方便,二是为了可以从head开始当作反转开始// 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论 ListNode dummyNode = new ListNode(-1); .原创 2021-12-18 12:59:15 · 217 阅读 · 0 评论 -
力扣刷题1
剑指 Offer 24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode reverseList(原创 2021-12-17 22:03:43 · 201 阅读 · 0 评论