- 博客(59)
- 收藏
- 关注
原创 java键盘输入构建任意二叉树并实现前序、中序、后续遍历
import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class CreateBinaryTree { public static void main(String[] args) { //初始化数据 ArrayList<String> nums = new ArrayList<>(); System.out.p
2021-11-23 19:59:41
3177
原创 leetcode刷题记录day036:61和2
61、难度中等:方法一:闭合为环:思路:原理简述:把单链表首尾相接形成环链表,由于结果链表是原始链表每位元素定长的后移,所以我们只需在 head + 位移数 的节点处断开,把 head + 位移数 节点当做新 head 节点即可。class Solution { public ListNode rotateRight(ListNode head, int k) { if (k == 0 || head == null || head.next == null) {
2021-11-01 19:39:50
351
原创 leetcode刷题记录day035:138和430
138、难度中等:方法一:原创:暴力哈希表:思路:有三点有解决的:①、构建所有的next:第一轮循环从头开始遍历②、每个next和random都不能是原先链表的节点:创建新链表节点时采用ano.next = new Node(head.next.val,null,null);方式③、构建所有的random:创建哈希表,第一轮循环时加入原链表和新链表各节点的逐个对应关系,第二轮循环从头开始遍历,从哈希表中取出新链表的节点,采用ano.random = con.get(ori.random);方式/
2021-10-31 11:28:38
342
原创 leetcode刷题记录day034:328和707
328、难度中等:要求:1、使用原地算法完成。算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。2、结果链表中第一部分应该为奇数节点总和,然后是偶数节点总和。3、结果链表保持原有节点顺序。方法一:原创:分离节点后合并思路:如果题传链表为空或者只有一个节点那就返回首节点。head节点作为创造出奇数链表的首节点,ans = head 保留首节点。ou = head.next 作为创造出偶数链表的首节点,oushou = ou 保留首节点。然后开始循环,
2021-10-28 15:42:44
751
原创 leetcode刷题记录day033:203和160
203、难度简单:方法一:原创:新链表原理:首先创建两个新节点,一个作为构建答案链表,一个作为返回值的新链表头结点。开始循环遍历题传链表,只要题传链表的当前节点不为空就一直循环。若当前节点的值不是题传val,那就把当前节点作为新链表的一项now.next = head;,同时now、head后移now = now.next;、head = head.next;若当前节点的值是题传val,那就直接head后移,now不动。循环结束后,我们存在一个漏洞,如果题传链表的最后一个节点其值是题传val,那
2021-10-26 15:33:56
137
原创 leetcode刷题记录day032:841和142
841、难度中等:题意:存在一个二维数组 rooms[i] [j],第一维的序号 i 代表房间序号。而每个房间里有一串钥匙,这也是数组 rooms 的每个元素是一个一维数组的原因,所以 rooms 是一个二维数组。思路:当 x 号房间中有 y 号房间的钥匙时,我们就可以从 x 号房间去往 y 号房间。如果我们将这 n 个房间看成有向图中的 n 个节点,那么上述关系就可以看作是图中的 x 号点到 y 号点的一条有向边。这样一来,问题就变成了给定一张有向图,询问从 0 号节点出发是否能够到达所有的节点。
2021-10-24 18:06:19
126
原创 leetcode刷题记录day031:542和733
733、难度简单:本题和200、岛屿数量类似题意:题目会传给我们 1 个二维数组(作为图画)、sr 和 sc 作为该二维数组某元素(初始坐标)的坐标、newColor作为要替换的值。观察示例1:二维数组如下(阶段一),初始坐标为(1,1)也就是二维数组中第二行、第二列的值为 1 的元素。然后根据题目要求,将该元素替换为 2,同时将该元素的上下左右四个方向的与该元素同值的元素也都替换为 2,变为阶段二。同时阶段二中所有值为 2 的元素其四个方向元素只要值为 1 就也替换为 2。一直到无法再扩散出相同值
2021-10-21 19:55:06
176
原创 JAVA一行代码实现整型int互换的原理:b = a+b - (a=b);、a = b + (b = a) * 0;
利用赋值运算符和加减来实现两个数互换:b = a+b - (a=b);利用赋值和加乘来实现两个数互换:a = b + (b = a) * 0;代码原理推理过程:在 idea 中执行下面一行代码,会出现反应1、2b = b + (b = a);1、idea 提示(非报错):第二个 b 没反应,第三个 b 显示The value a assigned to ‘b’ is never used简称: b 从未被使用过简称:…由"int c; c = 6; 后续无 c 的调用;" 中的第二个 c 会报相
2021-10-21 12:49:50
719
原创 leetcode刷题记录day030:225和394
225、难度简单:方法一:两个队列:时空复杂度:O(n)要求:实现每种操作的均摊时间复杂度为 O(1) 的栈(换句话说,执行 n 个操作的总时间复杂度 O(n) ,尽管其中某个操作可能需要比其他操作更长的时间。可以使用两个以上的队列)class MyStack { Queue<Integer> queue1; // 用于存储栈内的元素 Queue<Integer> queue2; // 作为入栈操作的辅助队列 /** Initialize your d
2021-10-19 20:11:26
213
原创 leetcode刷题记录day029:94和232
94、难度简单:方法一:递归:时空复杂度O(n):递归不安全,对于严重线性化的二叉树,有可能栈溢出原理:二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。定义 inorder(root) 表示当前遍历到 root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 root 节点的左子树,然后将 ro
2021-10-18 19:59:16
211
原创 leetcode刷题记录day028:494和133
494、难度中等:思路:数组中有 n 项就有一共有 2^n 种可能(每个元素可能为正可能为负共两种情况,共 n 个元素)(因为0 <= nums[i] <= 1000)所以我们只能暴力遍历所有可能性遍历所有情况时,要确保每次遍历出的情况都不相同,求各自的值。当 n 个元素都添加符号之后,即得到一种表达式,只要与target相同就计数+1。本题属于背包问题:以下链接(力扣上的背包问题)从评论区中摘选:这一块建议直接去官方题解的评论区中查看01背包:416. 分割等和子集 474. 一和
2021-10-16 23:11:35
378
原创 leetcode刷题记录day027:150和739
150、难度中等:今天和朋友一起喝多了,可能解析不够明确题目含义:逆波兰表达式:题目提示:方法一:原创:栈:下方代码无法通过原因不明,但修改后可以,修改操作在代码下方// 该代码在编译器如idea中可以运行且答案正确,但leetcode中显示报错:// java.lang.NumberFormatException: For input string: "+"class Solution { public int evalRPN(String[] tokens) {
2021-10-15 21:18:21
292
原创 leetcode刷题记录day026:752和279
752、难度中等:方法一:广度优先搜索:代码描述在注释中,更细节的解释在代码下方的代码解释中class Solution { public int openLock(String[] deadends, String target) { if ("0000".equals(target)) { return 0; } // 将deadends里的值加入哈希表中 Set<String> dead
2021-10-15 00:16:24
256
原创 leetcode刷题记录day025:200和68
200、难度中等:代码注释中有详细解释方法一:原创:评论区:题解中这里修改了原数组,大家如果面试的时候,要问清楚面试官是否能修改原数组,不能的话就得加入标记数组思路:不要被题给的二维数组吸引注意力,题目让我们求出岛屿的数量,而构成岛屿的条件:(1)当前项为1(2)当前项的左右上下四项值均未0或者无值于是我们通过下标运算将二维数组网格化,并根据上面的(1)(2)条件:只有遍历到的当前项为 1 时开始记录岛屿数(把构成当前岛屿的 1 换为 0,原因在后面),不为 1 继续遍历。若为1,再判断上下左
2021-10-14 00:45:07
176
1
原创 JAVA用数组、树实现并查集
并查集:主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合中。以下部分是观看视频 https://www.bilibili.com/video/BV1ct4y167Ua 时记录下的笔记// 改进版:树的简单实现public class UnionFind2 { private int[] parent; // parent[i] 表示第 i 个元素所指向的父节点
2021-10-14 00:42:12
170
原创 leetcode刷题记录day024:20和118
20、难度简单:通过率45%方法一:原创:失败的暴力:仅用于我自己日后审视,这里面有我一开始没想到但后续出现的各种情况以及相应的应对原理:正常判断当前项和下一项是否为一堆括号,并添加左括号群体(如"{{{}}}")的应对措施失败点:如情况"(([]){})"下面代码会将true判断为falseHashMap相关知识网站:https://m.runoob.com/java/java-hashmap.html?ivk_sa=1024320uclass Solution { public boo
2021-10-12 23:02:36
143
原创 JAVA中Integer源码的reverse方法全面细致解析
在写leetcode网站的“”190. 颠倒二进制位”算法题时发现了这个方法的源码,于是有了如下研究成果。大致思想原理若要翻转一个二进制串,可以将其均分成左右两部分,再对划分出的左右部分各自进行划分左右,直至每部分只有一个元素(对每部分递归执行翻转操作)然后将左半部分拼在右半部分的后面,即完成了翻转(例如12,左半放右半后面变为21就是翻转;1234,先划分左右,到各区域仅1个元素后开始返回,第一次返回2143,第二次返回4321,翻转完成)由于左右两部分的计算方式是相似的,利用位掩码和位移运算
2021-10-11 23:56:49
521
原创 leetcode刷题记录day023:190和461
190、难度简单:提示:在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在示例 2中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825方法一:逐位颠倒:时间复杂度:O(logn) 空间复杂度:O(1)原理:将 n 视作一个长为 32 的二进制串,从低位往高位枚举 n 的每一位,将其倒序添加到翻转结果 rev 中。代码实现中,每枚举一位就将 n 右移一位,这样当前 n 的最低位就是我们要枚举的比特位。当 n 为 0 时即可结束循环。需要注意的是,在某些语言(如
2021-10-11 23:50:51
196
原创 leetcode刷题记录day022:13和191
13、难度简单:方法一:原创:暴力解法:哈希表原理:为了考虑到六种特殊情况,我们需要在遍历字符串时对比当前项和下一项:(1)若当前项小于下一项,给总数添加(下一项的对应数值 - 当前项的对应数值)。此时这两项都被使用完了,下标直接指向当前项的下一项的下一项。(2)否则,给总数添加当前项,考虑到下一项和下一项的下一项可能存在(1)关系,所以不给总值添加下一项的对应数值,而让下标指向当前项下一项。这么写时要注意 for 循环的写法:若 for 循环中单次表达式是 int i = 0,条件表达式是 i
2021-10-10 19:35:36
206
原创 leetcode刷题记录day021:326和204
326、难度简单:要求:不使用循环或者递归来完成本题注意:3的0次 =1,这也需要被考虑在内。方法一:试除法:时间复杂度:O(log n) 空间复杂度:O(1)我们不断地将 n 除以 3,直到 n=1。如果此过程中 n 无法被 3 整除,就说明 n 不是 3 的幂。本题中的 n 可以为负数或 0,可以直接提前判断该情况并返回 False,也可以进行试除,因为负数或 0 也无法通过多次除以 3 得到 1class Solution { public boolean isPowerOfThr
2021-10-09 16:13:26
142
原创 leetcode刷题记录day020:412和155
412、难度简单:改进描述基于:作者:LeetCode链接:https://leetcode-cn.com/problems/fizz-buzz/solution/fizz-buzz-by-leetcode/方法一:模拟法代码步骤:1、首先我们需要一个初始化一个空的答案列表:List supplierNames = new List(); 不可行原因:List是一个Interface,不能实例化一个Interface,因为interface是一个约定,表示什么样的方法应该具有我们的类。为了实
2021-10-08 20:30:45
179
原创 leetcode刷题记录day019:384和198
384、难度中等:方法一:暴力:时间复杂度 O(n^2) 空间复杂度 O(n)题意:题目要求我们实现 Solution 类的一个构造器和两个方法1、Solution(int[] nums) 使用整数数组 nums 初始化对象// 题目传入数组numspublic Solution(int[] nums) { // array 和 nums 指向同一数组,使用 array 利于在各方法间调用 array = nums; // 克隆传入数组作为备份,用于 reset o
2021-10-07 16:28:08
208
原创 leetcode刷题记录day018:121和53
121、难度简单:题意:某天买入股票,且在该天后的某天卖出。实例1中的 " 你不能在买入前卖出股票 " 意为:你只有在买入一个股票后才能卖出股票最多只允许完成一笔交易方法一:暴力解法:超出时间限制public class Solution { public int maxProfit(int[] prices) { int len = prices.length; if (len < 2) { return 0;
2021-10-05 20:50:29
309
原创 leetcode刷题记录day017:70和278
70、难度简单:题意:一个楼梯有 n 个台阶,你的每一步有两种选择,一次性跨2个台阶或1个台阶。求有多少种不同方法爬完楼梯。注意:给定 n 是一个正整数,非0非负方法一:数学class Solution { public int climbStairs(int n) { double sqrt_5 = Math.sqrt(5); double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 -
2021-10-04 18:31:36
276
原创 leetcode刷题记录day016:88和108
88、难度简单:要求:1、设计实现一个时间复杂度为 O(m + n) 的算法解决此问题2、合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n方法一:直接合并后排序:时间复杂度:O((m+n) log(m+n)) 空间复杂度:O(log(m+n))最直观的方法是先将数组 nums 2放进数组 nums 1 的尾部,然后直接对整个数组进行排序。
2021-09-30 21:01:00
190
原创 leetcode刷题记录day015:101和102
101、难度简单:要求:运用递归和迭代两种方法解决这个问题:方法一:递归:时间复杂度:这里遍历了这棵树,渐进时间复杂度为 O(n) 空间复杂度:这里的空间复杂度和递归使用的栈空间有关,这里递归层数不超过 n,故渐进空间复杂度为 O(n)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *
2021-09-29 14:57:44
80
原创 leetcode刷题记录day014:104和98
104、难度简单:方法一:深度优先搜索:时间复杂度:O(n) 空间复杂度:O(height)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * Tree
2021-09-28 21:08:24
220
原创 leetcode刷题记录day013:141和234
141、难度简单:要求:O(1)(即,常量)内存解决此问题方法一:哈希表:时间复杂度:O(N) 空间复杂度:O(N)/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public c
2021-09-27 14:57:06
268
原创 leetcode刷题记录day012:206和21
206、难度简单:要求:链表可以选用迭代或递归方式完成反转从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。从直观上讲,递归是将大问题化为相同结构的小问题,从待求解的问题出发,一直分解到已经已知答案的最小问题为止,然后再逐级返回,从而得到大问题的解(一个非常形象的例子就是分类回归树 classification and regression tree,从root出发,先将root分解为另一个(root,sub-tree)
2021-09-26 09:30:46
245
原创 leetcode刷题记录day011:19和18
19、难度中等:要求:使用一趟扫描实现提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz方法一:原创题解:结构体数组/** * 题目给出的该链表结构体构造: * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN
2021-09-25 12:17:31
140
原创 leetcode刷题记录day010:14和38
14、难度简单:通过率40%方法一:横向扫描:时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。空间复杂度:O(1)。使用的额外空间复杂度为常数。substring() 方法返回字符串的子字符串。class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs
2021-09-24 09:23:13
131
原创 leetcode刷题记录day009:28和8
28、难度简单:通过率40%说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。题给施舍:haystack 和 needle 仅由小写英文字符组成方法一:KMP算法使用枚举的朴素解法,不考虑剪枝的话复杂度是 O(m * n) 的,而 KMP 算法的复杂度为 O(m + n)KMP 之所以能够在 O(m + n)
2021-09-23 20:15:02
334
原创 leetcode刷题记录day008:125和242
125、难度简单:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。本题中:只考虑字母和数字字符,可以忽略字母的大小写;将空字符串定义为有效的回文串;字符串 s 由 ASCII 字符组成方法一:筛选 + 判断:时间复杂度:O(∣s∣) 空间复杂度:O(∣s∣) 其中 |s∣ 是字符串 s 的长度。最简单的方法是对字符串 ss 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 sgood 中。这样我们只需要判断 sgood 是否是一个普通的回
2021-09-22 12:26:22
258
原创 leetcode刷题记录day007:7和387
7、难度简单:难点:如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0环境不允许存储 64 位整数(有符号或无符号)。表示方法:(-Math.pow(2,31))>count || count>(Math.pow(2,31)-1)不可行处:因为题目要求不允许使用 64 位整数,即运算过程中的数字必须在 32 位有符号整数的范围内,因此我们不能直接按照上述式子计算,需要另寻他路。如果无法超越32位,那我们就用32位能表达的极限数字除于10来
2021-09-21 14:24:33
123
原创 leetcode刷题记录day006:48和344
48、难度中等:要求:在 原地 旋转图像方法一:自外向内顺时针循环:class Solution { public void rotate(int[][] matrix) { if(matrix.length == 0 || matrix.length != matrix[0].length) { //若传来的数组不是等边的或者元素为0那就返回 return; } int nums = matrix.length; //二
2021-09-20 18:26:14
157
原创 leetcode刷题记录day005:1和36
1、难度简单:强行让你接触哈希表要求:时间复杂度小于 O(n2) 的算法方法一:暴力枚举:时间复杂度O(N2),空间复杂度O(1)class Solution { public int[] twoSum(int[] nums, int target) { int n = nums.length; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) {
2021-09-20 00:02:27
226
原创 leetcode刷题记录day004:66和283
66、难度简单:本题难点:若数组中元素为 [9] 或 [9,9,9] 时,末尾加一操作会增大数组的内容,[9] 变 [1,0] ,[9,9,9] 变 [1,0,0,0]class Solution { public int[] plusOne(int[] digits) { for (int i = digits.length - 1; i >= 0; i--) { digits[i]++; digits[i] = digit
2021-09-18 14:57:38
130
原创 软件工程专业四年注意事项以及学习计划
如果你计划成为程序员,那么这四年里每一年都是异常关键的。如果你想要就业,那么打比赛获奖和刷算法题将成为你的主要要做的事情。如果你打算考研,那你最好能争取到学校的保研资格。比赛和实验室进入实验室是非常重要的,我的大学的实验室是在大一刚入学时就进行了招生。不但如此,acm实验室等其他实验室基本只招每届的新生,你如果在入学时错过了那你可能会后悔接下来的三年里没有一个好的学习环境和获取行业相关情报的来源。软件杯、互联网+、创青春、acm、数学建模、大学生数学竞赛等这些比赛集中在在我们大一下学期和大二上学期
2021-09-17 19:51:29
3834
原创 leetcode刷题记录day003:004和350
217、难度简单:本题难点:时间有限制,尽量不用两层for循环class Solution { public boolean containsDuplicate(int[] nums) { Arrays.sort(nums); int n = nums.length; for (int i = 0; i < n - 1; i++) { if (nums[i] == nums[i + 1]) {
2021-09-17 19:32:08
222
原创 leetcode刷题记录day002:189和217
189、难度中等:内容参考了官方答案题意:把数组想成环首尾相连,右移相当于转动环要求:1、使用空间复杂度为 O(1) 的 原地 算法解决这个问题;2、至少有三种不同的方法可以解决这个问题解题思路:1、O(1)就是最低的时空复杂度,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。如int一个变量,无论数值多大耗时耗空间都不变。而循环则不痛,数值越大循环次数越多,耗时越多。2、由于要求原地解决所以我们应创造出一个公式来解决位置变换问题。旋转取得当前元素下一个位置的
2021-09-16 17:46:00
126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人