刷题
....
小李子还挺酸
突飞猛进往往是自然发生的。你在某个夜晚苦熬一个知识点时,不会觉得自己突飞猛进;只有在多年后某日熟练地给别人讲解这个知识点后,内心才会小小地波动一下,猛然忆起当年深夜中的青灯一盏。
展开
-
<LeetCode>盛最多水的容器
题目盛最多水的容器思路及代码思路1 暴力循环(数组元素过多会超时)(1)从第一个元素开始到倒数第二个元素都有机会作为容器的左壁高度for(int i=0;i<height.length-1;i++)(2)从该元素的下一个元素开始一直到最后一个元素,都有机会作为容器的右壁高度for(int j=i+1;j<height.length;j++)(3)选取左壁和右壁较低的作为当前形成的容器的高度,选择左壁与右壁之间的的距离作为容器底的长度,即可计算容器可盛水量int len=j-i原创 2021-06-05 14:13:55 · 126 阅读 · 0 评论 -
<LeetCode>对称二叉树
题目对称二叉树思路判断树是否对称,那么就是判断根结点root的两个子树root.left和root.right是否对称。将特殊情况进行额外处理如根结点为空,根结点没有左右子树,那么也是对称二叉树,返回true解决完特殊情况以后,那么就判断根结点的左右子树是否对称假设根结点root的左子树的根结点为root1,根结点root的右子树的根结点为root2那么就对这两个子树进行判断判断root1.left==root2.right?root1.right==root2.left?代码/*原创 2021-06-04 22:49:54 · 73 阅读 · 1 评论 -
<LeetCode>最大子序和
题目最大子序和思路思路1(可能会超时)对数组进行分组,分组大小由每组一个元素到每组所有元素(这种情况也就是分为一组,一组包含所有元素)由于每次分组后都从头按组来遍历计算大小,因此最外层for循环为分组后组内元素的个数的递增第二层for循环是从某一个位置开始,根据从该位置开始的元素个数,判断是否能构成一个组第三层for循环是计算组内的和,计算完后和maxSum进行比较 ,maxSum就是最终需要返回的最大子序和思路2maxSum存储当前已得到的最大子序和curSum用于计算得到某一子序的原创 2021-06-04 21:35:36 · 148 阅读 · 1 评论 -
<LeetCode>二叉搜索树的范围和/二叉树的最大深度/剑指 Offer 55 - II. 平衡二叉树/剑指 Offer 12. 矩阵中的路径
一、二叉搜索树的范围和题目二叉搜索树的范围和思路考虑3种情况(1)当前结点的值在区间[low,high](2)当前结点的值小于low(3)当前结点的值大于high代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeN原创 2021-05-12 21:36:52 · 145 阅读 · 0 评论 -
<LeetCode>剑指 Offer 50. 第一个只出现一次的字符
题目第一个只出现一次的字符思路1(HashMap)利用HashMap,查询第一个只出现一次的字符,那么在第一轮循环字符串统计各个字符出现的次数,然后第二轮循环字符串,使用已经构建好的HashMap,当第一次找到出现次数为1时,返回该字符即可。代码1class Solution { public char firstUniqChar(String s) { HashMap<Character,Integer> hashmap=new HashMap<>原创 2021-05-10 18:03:43 · 92 阅读 · 1 评论 -
<LeetCode>剑指 Offer 51. 数组中的逆序对
题目思路(1)暴力求解由于数组长度限制为0-50000,两层循环最终会导致超时,因此不可取(2)归并排序归并排序分为分-治两阶段,统计逆序对是在治的阶段,即合并过程中统计的。合并阶段 本质上是 合并两个排序数组 的过程,而每当遇到 左子数组当前元素 > 右子数组当前元素 时,意味着 「左子数组当前元素 至 末尾元素」 与 「右子数组当前元素」 构成了若干 「逆序对」 。例如当前需要归并排序的数组为[7,5,6,4]第一次合并的两数组为[7],[5]①7与5比较由于7>5,因原创 2021-05-09 19:49:18 · 93 阅读 · 0 评论 -
<LeetCode>剑指 Offer 14- I. 剪绳子
题目思路代码class Solution { public int cuttingRope(int n) { if(n<=3) { return n-1; } int a=n/3; int b=n%3; if(b==0) { return (int)Math.pow(3,a); } else i原创 2021-05-09 17:27:39 · 69 阅读 · 0 评论 -
<LeetCode>三数之和----利用哈希表和两数之和解题
题目三数之和思路1、将三数之和转化为两数之和,取其中一个数转化为两数之和的值如-1,则寻找除了这个数之外,任意两个数的和为1(即-1的绝对值)2、创建一个函数实现两数之和,找到后将三个数传入llist中保存,函数的参数为数组,数值及数值的位置,要数值的位置是为了防止求两数之和下标重复3、利用HashMap来快速找到合适的数代码/*x1+x2+x3=0-x3=x1+x2传入-x3,x2=-x3-x11、将三数之和转化为两数之和,取其中一个数转化为两数之和的值如-1,则寻找除了这个原创 2021-05-05 17:54:40 · 219 阅读 · 1 评论 -
<LeetCode>剑指 Offer 30. 包含min函数的栈
题目包含min函数的栈思路使用两个栈A,B,栈A正常完成push,pop,top操作;栈B用于维护非严格降序的栈,即在push操作时,判断此次push的元素是否小于等于当前栈B的栈顶元素,若是,则压入栈B,否则不压入。代码class MinStack { Stack<Integer> A,B; /** initialize your data structure here. */ public MinStack() { A=new Stack原创 2021-05-05 14:56:31 · 66 阅读 · 0 评论 -
<LeetCode>剑指 Offer 31. 栈的压入、弹出序列
题目栈的压入、弹出序列思路1、为popped序列设置一个指针,先压栈,然后当栈非空时,判断当前栈顶元素是否与指针指向的元素相等2、若相等,则弹出栈顶,然后继续判断是否相等,直至不等则继续压栈3、若最后指针不能遍历完popped序列,返回false源代码class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> stac原创 2021-05-03 17:12:54 · 150 阅读 · 0 评论 -
<LeetCode>剑指 Offer 35. 复杂链表的复制
复杂链表的复制题目如下:思路:1、先复制原始链表2、由于还有个random指针,因此使用一个HashMap来保存,其中,以原始链表的结点作为值,对应的复制链表的结点作为键源代码:/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = .原创 2021-05-02 23:39:58 · 72 阅读 · 0 评论 -
<LeetCode>刷题记录
括号序列import java.util.*;public class Solution { /** * * @param s string字符串 * @return bool布尔型 */ public boolean isValid (String s) { // write code here Stack<Character> stack=new Stack<>();原创 2021-05-01 12:26:02 · 140 阅读 · 0 评论 -
<LeetCode>二叉树的直径
题目如下:这道题需要注意的一点是:二叉树的直径(即最长路径),不一定经过根结点。下图就是不经过根结点的例子(图中黑色的结点表示最长路径的起讫点):解题思路:子问题定义二叉树的解题技巧是,首先判断问题能否划分为子问题、应当划分为什么样的子问题。二叉树直径实际上就是二叉树中的最长路径,我们是可以划分出子问题的:二叉树的最长路径 = \max { 左子树的最长路径, 右子树的最长路径, 经过根结点的最长路径 }二叉树的最长路径=max{左子树的最长路径,右子树的最长路径,经过根结点的最长路径}其中转载 2021-04-19 00:07:42 · 225 阅读 · 0 评论 -
<LeetCode>判断一个链表是否为回文链表
1、回文链表解决方法:(1)使用栈/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this原创 2021-04-16 20:42:52 · 141 阅读 · 0 评论 -
<LeetCode>21、合并两个有序链表
21、合并两个有序链表非递归:创建一个新结点newHead,然后再创建一个副本tmpNode用于将l1和l2中的较小者插入到newHead中的尾部,然后l1与l2分别迭代比较,直到其中一个为null结束迭代。最后注意返回的是newHead.next而不是newHead,合并的链表应该是newHead.next开始。/** * Definition for singly-linked list. * public class ListNode { * int val; * L原创 2021-04-13 15:49:39 · 57 阅读 · 0 评论 -
<LeetCode>19.删除链表的倒数第N个结点
删除链表的倒数第N个结点1、先为其创建一个头结点tempHead,这样便于删除第一个结点2、使用快慢指针来找到需要删除的结点,如果是读取待删除的结点,则可以直接找到待删除的结点,但是这里要找到待删除结点的前一个结点,这样才能完成删除结点。读取待删除结点则快慢指针之间的距离为n-1,n是倒数第n个删除待删除结点则快慢指针之间的距离为n如读取倒数第1个结点,则快慢指针相差距离为0,即一起遍历如删除倒数第1个结点,则快慢指针相差距离为13、返回链表的头结点的时候不能返回head,因为head一开始原创 2021-04-11 21:32:02 · 77 阅读 · 0 评论 -
<LeetCode>206. 反转链表
206. 反转链表题目:递归:若链表为空或长度为1,则不用反转,直接返回即可否则递归向下查找,直到找到最后一个结点,然后返回返回过程中修改相邻结点的指向关系,然后让此时的最后一个结点指向null即可。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int v原创 2021-04-11 20:18:41 · 92 阅读 · 0 评论 -
<LeetCode>237. 删除链表中的节点
237. 删除链表中的节点这题中文有点坑,建议看英文了解题目。这里是只给了要删除的结点,没有给头结点,那么就不可能通过遍历来找到值然后删除。这里的做法是:将传入的结点node的值赋为其后继结点的值,即node.val=node.next.val;然后通过使node的next域指向node的后继结点的后继结点,就能变向实现删除结点node的操作了即node.next=node.next.next;/** * Definition for singly-linked list. * publ原创 2021-04-11 17:59:00 · 63 阅读 · 0 评论 -
<LeetCode>剑指 Offer 18. 删除链表的节点(java实现)
剑指 Offer 18. 删除链表的节点给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题目中提到了给的是单向链表的头指针头指针与头结点的区别:头指针头结点头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可以存放链表的长度)头指针具有标志作用,所以常用头指针冠以链表的名字有了头结点,对在第一元素结点前插入结点和删原创 2021-04-11 17:44:19 · 90 阅读 · 0 评论 -
<LeetCode>两数之和、数组中的重复数字、替换空格
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。class Solution{ //两个指针,一个指针由前向后遍历,原创 2021-04-09 10:43:19 · 395 阅读 · 0 评论 -
<LeetCode>两数之和
原题给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9], l2原创 2021-04-09 01:35:11 · 101 阅读 · 0 评论 -
<LeetCode>88. 合并两个有序数组
题目传送阵class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int p=m+n-1; //指向nums1数组的末尾 int i=m-1,j=n-1; //分别指向nums1,nums2的最后一个元素 while(i>=0 && j>=0) { if(nums1[i]>n原创 2021-04-05 18:50:10 · 82 阅读 · 0 评论 -
<LeetCode>剑指 Offer 10- II. 青蛙跳台阶问题
问题描述传送本质:斐波那契数列[0,1,1,2,3,5,8,13,…]当n=0,步数res=1当n=1,res=1当n=2,res=2当n > 2时,最后一跳可以跳一下,即从第n-1台阶上跳上来, 也可以跳两下,即从第n-2台阶上跳上来。因此第n阶的跳数有f(n)=f(n-1)+f(n-2)int numWays(int n){ long long int res=0; long long int fib[n+3]; if(n==0 || n==1)原创 2021-04-03 17:18:01 · 95 阅读 · 0 评论 -
<LeetCode>剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.用两个指针,第一个指针先走k-1步,然后再两个指针一起走,这样就保证了第二个指针与第一个指针距离相差k-1,当第一个指针到达链表.原创 2021-04-03 16:23:13 · 131 阅读 · 0 评论