leetcode刷题
leetcode每日刷题,在csnd记录自己的题解
reasonablelittleVV
我们都在努力奔跑,我们都是追梦人!在学习过程中知识需要被记录,CSND就是一个很好的平台!!!
展开
-
第144题:二叉树的前序遍历
解题思路第144题:二叉树的前序遍历递归:根-》左子树-》右子树非递归:迭代代码方法一:递归class Solution { public static List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new LinkedList<Integer>(); preorder(root, res); return res; } public s原创 2021-03-19 15:58:12 · 91 阅读 · 0 评论 -
第1021题:删除最外层的括号
解题思路第1021题:删除最外层的括号该题关键在于找到字符串中的每一个原语的起始位置和结束位置,这样就可以使用字符串的截取方法截取到我们想要的结果,再进行拼接。栈 :借助栈进行原语分解,遍历元素,’(‘入栈,’)'出栈,当栈一空就标志着一个原语的结束,找到该原语的起始位置和结束位置,就可以找出该原语最外层括号所包围的内容。不借助栈,在原字符串上进行操作:找到字符串中的每一个原语的起始位置和结束位置,并进行截取,最后拼接。代码方法一:栈class Solution { //方法一:栈原创 2021-03-19 15:57:35 · 108 阅读 · 0 评论 -
第225题:用队列实现栈
解题思路225. 用队列实现栈 该题和 剑指 Offer 09. 用两个栈实现队列是相对的。主要是要把先进先出的元素顺序变成后进先出的元素顺序,该题参考了来自评论区的大佬!!二个队列一个队列 :循环出对入队处理数据,就可以对数据进行倒序处理代码方法一:二个队列class MyStack { Queue<Integer> a; Queue<Integer> b; /** Initialize your data structure he原创 2021-03-19 15:57:02 · 87 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
解题思路剑指 Offer 09. 用两个栈实现队列题目要求二个栈实现队列,一个添加方法和一个删除方法。因为栈是后进先出,队列时先进先出,可以用一个栈添加元素,要删除的时候再把栈中的元素依次出栈放到另一个栈中进行删除,因为经过二次倒叙后元素的顺序就变成了正序(负负为正),这样就满足了队列的要求。代码class CQueue { Deque<Integer> stack1; Deque<Integer> stack2; public CQueue() {原创 2021-03-19 15:56:26 · 62 阅读 · 0 评论 -
2021-03-18
解题思路20. 有效的括号使用栈:遍历字符串,如果为左括号就入栈,为右括号就弹出栈顶元素,跟当前右括号对比,如果不匹配就返回false,遍历完整个字符串,如果全部匹配成功,那么此时栈中无元素代码class Solution { //方法一:遍历字符串依次入栈,当遇到右括号就弹出栈顶,看是否与右括号对应。 public static boolean isValid(String s) { Deque<Character> stack = new LinkedList<&原创 2021-03-18 08:19:11 · 69 阅读 · 0 评论 -
第202题:快乐数
解题思路202. 快乐数 参考了官方题解根据题目可知最终只有二种结果:在某个值后无限循环或者收敛到1。这样就可以哈希表:用哈希表把每次结果都存入,如果碰到相同的数就说明开始循环了;或者检测到要存入的值是1时,就说明它是快乐数,因为已经收敛到1了。快慢指针:如果 n 是一个快乐数,即没有循环,那么快指针最终会比慢指针先到达数字 1。 如果 n 不是一个快乐的数字,那么最终快指针和慢指针将在同一个数字上相遇。代码方法一:哈希表class Solution { //方法一:哈希表原创 2021-03-18 08:18:31 · 73 阅读 · 0 评论 -
第349题:两个数组的交集
解题思路[349. 两个数组的交集](https://leetcode-cn.com/problems/intersection-of-two-arrays/哈希表排序 + 双指针代码方法一:哈希表class Solution { //方法一:哈希表 public static int[] intersection(int[] nums1, int[] nums2) { //把一个数组加入哈希表中,然后经过对比第一个哈希表中的元素,把与另一个数组相同的元素放到第二个哈希表中,因原创 2021-03-18 08:18:01 · 57 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II
解题思路剑指 Offer 56 - II. 数组中数字出现的次数 II哈希表:把所有数字及其出现的次数存入哈希表,然后遍历哈希表找到次数为1的数字位运算:统计数字中的各个位中1出现的次数,当为3n 次时,只出现一次的数字的对应位应当为0,当为3n + 1次时,只出现一次的数字的对应位应当为1。代码方法一:哈希表import java.util.Map.Entry;class Solution { //方法一:哈希表:把所有数字及其出现的次数存入哈希表,然后遍历哈希表找到次数为1的数原创 2021-03-18 08:17:30 · 53 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
解题思路剑指 Offer 56 - I. 数组中数字出现的次数用哈希表来判断元素是否重复,重复则删除,最后哈希表中只剩二个不重复的元素,然后赋值给int数组。虽然能成功解题,但时间复杂度并不是题目要求的O(1)。正解:位运算 参考大神的题解:Krahets:数组中数字出现的次数(位运算,清晰图解)代码方法一:哈希表class Solution { public static int[] singleNumbers(int[] nums) { Set<Integer&原创 2021-03-18 08:17:00 · 42 阅读 · 0 评论 -
第1207题:独一无二的出现次数
解题思路1207. 独一无二的出现次数该题主要找到每个数值出现的次数,思路如下:①可以先使用一个哈希表存入每个数值及其出现的次数;②然后再用一个哈希表单独存放各数值出现的次数,存入的过程中如果发现有相同的次数,就返回false,否则不存在相同的次数,那么就返回true。代码class Solution { //哈希表 public static boolean uniqueOccurrences(int[] arr) { //把数组中的数值及其出现的次数存入哈希表map中 Ma原创 2021-03-18 08:16:30 · 118 阅读 · 0 评论 -
第242. 有效的字母异位词
解题思路242. 有效的字母异位词这个题目主要是判断字符和字符个数排序:转换成数组进行排序后,然后再转换成字符串用equal比较哈希表:存放第一个字符串中的每一个字符及其出现的次数,然后遍历第二个字符串,比较二个字符串出现的字符及出现的次数是否相同。代码方法一:排序class Solution { //数组的排序,排序后然后换成字符串用equal比较 public static boolean isAnagram(String s, String t) { char[] c1原创 2021-03-18 08:15:55 · 41 阅读 · 0 评论 -
第28题:实现 strStr()
解题思路28. 实现 strStr()利用String库函数直接求解遍历haystack字符串代码方法一:利用String库函数直接求解class Solution { public static int strStr(String haystack, String needle) { int pos = haystack.indexOf(needle); return pos; }}方法二:遍历haystack字符串class Solution原创 2021-03-18 08:15:20 · 62 阅读 · 0 评论 -
13题:罗马数字转整数
解题思路13. 罗马数字转整数遍历字符串每一个字符,遇到相应的字符就加对应的数值,但需要注意题目所给出的六种特殊情况,所以要用一个字符变量记录当前字符的前一个字符,二者组合是否符合六种特殊情况,属于就加特殊的数值,不然就加正常的数值。代码方法一:class Solution { public static int romanToInt(String s) { int result =0; char curr_c =' ', prev_c = ' '; //当前字符和前一个原创 2021-03-18 08:14:47 · 75 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
解题思路剑指 Offer 58 - II. 左旋转字符串使用两个StringBuilder 一个保留左旋转的子串,另一个保留剩下的子串,最后用剩下的子串连接左旋转的子串。代码方法一:class Solution { public static String reverseLeftWords(String s, int n) { StringBuilder a = new StringBuilder(); StringBuilder b = new StringBuilder();原创 2021-03-18 08:14:17 · 37 阅读 · 0 评论 -
第151题:翻转字符串里的单词
解题思路151. 翻转字符串里的单词粗糙的方法:先去掉前后的空格,然后把字符串以多个空格切分开来发到字符串数组里,然后倒序数组,最后遍历字符串数组,拼接成字符串。代码class Solution { public static String reverseWords(String s) { s=s.trim(); String regex = "\\s+"; //用正则表达式代表多个空格 String[] str = s.split(regex); reverseArr(s原创 2021-03-17 21:05:21 · 45 阅读 · 0 评论 -
剑指 Offer 05: 替换空格
解题思路剑指 Offer 05: 替换空格直接利用String的库函数遍历字符串代码方法一:直接利用String的库函数class Solution { public static String replaceSpace1(String s) { return s.replace(" ", "%20"); }}方法二:遍历字符串class Solution { public static String replaceSpace(String s) { Str原创 2021-03-17 21:04:43 · 57 阅读 · 0 评论 -
第344题: 反转字符串
解题思路344. 反转字符串简单的数组倒序算法代码数组倒序class Solution { public static void reverseString(char[] s) { char temp =' '; for(int i=0;i<s.length/2;i++) { temp = s[i]; s[i] = s[s.length-i-1]; s[s.length-i-1原创 2021-03-17 21:04:13 · 50 阅读 · 0 评论 -
剑指 Offer 52:两个链表的第一个公共节点
解题思路剑指 Offer 52:两个链表的第一个公共节点注意看清题目!!!:输入两个链表,找出它们的第一个公共节点。公共节点:不仅内容要相同,而且节点地址要相同,即同一个节点有二种思路:使用哈希表。先遍历一个链表,把其所有的节点都放入哈希表中,然后遍历另一个链表的过程中使用哈希表查询是否有相同的节点。双指针。两个指针A,B分别指向headA链表和headB链表,指针 A 先遍历完链表 headA ,再开始遍历链表 headB。指针B亦是如此,先遍历玩链表headB,再开始遍历链表A。因为长度:原创 2021-03-17 21:03:42 · 53 阅读 · 0 评论 -
剑指 Offer 22.:链表中倒数第k个节点
解题思路剑指 Offer 22.:链表中倒数第k个节点该题关键在于找到链表中倒数第k个节点的位置,可以使用指针来锁定节点位置。使用快慢指针,快指针与慢指针保持K个节点的距离,然后一同遍历到链表尾,那样快指针就到了原链表的尾部,快指针往前K-1个节点的位置就是新链表头节点的位置(即慢指针的下一个节点),所以,新链表的头部就是慢指针的下一个节点。代码/** * Definition for singly-linked list. * public class ListNode { * i原创 2021-03-17 21:03:09 · 54 阅读 · 0 评论 -
第61题:旋转链表
解题思路61. 旋转链表思路一: 循环链表该题因为要不断地移动链表,可以通过构造循环链表来实现。构造循环链表: 遍历链表,找到链表尾部的最后一个节点,链接链表的头部。同时计算链表的长度n。寻找移动k位后的链表的头部和尾部,并断开头尾由题意可知,向右移动1位,新的链表头为原来的第n个节点,尾为第n-1个节点,向右移动2位,新的链表头为n-1个节点,表尾为第n-2个节点…以此类推,向右移动k位,新的链表尾部为 第n-k%n个节点,新的链表头为第n-k%n+1个节点,就是尾的下一个。所以由原创 2021-03-17 21:02:17 · 51 阅读 · 0 评论 -
第86题:分隔链表
解题思路86. 分隔链表我们只需维护两个链表smaller和bigger即可,按顺序分别存储小于x的节点和大于等于x的节点。遍历完原链表后,我们只要将 smaller链表尾节点指向bigger链表的头节点即能完成对链表的分隔。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * Li原创 2021-03-17 21:01:48 · 51 阅读 · 0 评论 -
第141题:环形链表
解题思路141. 环形链表该题有二种思路哈希表:用hashSet记录已经遍历过的结点。快慢链表:快链表移动的快,慢链表移动的慢,若两指针相遇则判断有环代码方法一:哈希表/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next =原创 2021-03-17 21:00:52 · 40 阅读 · 0 评论 -
第206题:反转链表
解题思路206. 反转链表该题有三种思路:利用栈来达到反转链表的作用迭代,对原链表进行变化递归代码方法一:栈/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int原创 2021-03-17 21:00:15 · 49 阅读 · 0 评论 -
第203题:移除链表元素
解题思路203. 移除链表元素该题有三种思路:新创建一个链表,指向不相同的元素给head加一个虚拟头结点,然后在原链表上删除节点递归实现代码方法一:新创建一个链表,指向不相同的元素/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { t原创 2021-03-17 20:59:31 · 77 阅读 · 0 评论 -
第560题:和为K的子数组
解题思路560. 和为K的子数组这个题可以用暴力解法,也可以巧妙地用 前缀和+哈希表 来求解。前缀和思想和滑动窗口会经常用在求子数组和子串问题上 ,求子数组通常需要用到前缀和+哈希表的配合使用。思路和1.两数之和基本相似,代码方法一:暴力破解//运行时间:1239 ms 内存消耗:41.3MBclass Solution { /* * 暴力破解:全遍历 */ public static int subarraySum(int[] nums, int k) { int原创 2021-03-16 10:36:21 · 74 阅读 · 0 评论 -
第75题:颜色分类
解题思路75. 颜色分类第一眼看过去,这不就是数组的排序吗0.0方法一:直接用库函数排序。方法二:单指针 + 两次遍历。方法三:双指针 + 一次遍历。代码方法一:直接用库函数排序。class Solution { public static void sortColors(int[] nums) { Arrays.sort(nums); }}方法二:单指针 + 两次遍历class Solution { public static void s原创 2021-03-16 10:34:44 · 68 阅读 · 0 评论 -
剑指 Offer 03.:数组中重复的数字
解题思路剑指 Offer 03.:数组中重复的数字这个题的思路很简单,遍历数组中的值,出现重复的就停止并输出该值,考虑到哈希表效率高,就使用哈希表来解题。代码class Solution { public static int findRepeatNumber(int[] nums) { Set<Integer> map = new HashSet<>(); for (int key : nums) { if(map.contains(key)) {原创 2021-03-16 10:34:01 · 46 阅读 · 0 评论 -
第66题:加一
解题思路66. 加一这个题目看似很简单,只需要考虑到来自低位的进位,但其实是有坑的,还需要考虑数组越界情况。例如:9999+1=10000超出了原来的四位数组长度,这样就会出现数组越界错误。所以要加上一种特殊情况也就是所有数字全为9,加1后比如会比原来数组大1,所有要创建一个比原数组大1的数组,把0号置1,其他为0就可以了。代码class Solution { public static int[] plusOne(int[] digits) { int carry原创 2021-03-16 10:33:31 · 72 阅读 · 0 评论 -
第59题:螺旋矩阵 II
解题思路59. 螺旋矩阵 II该题54. 螺旋矩阵的思路是一样的。每层都按红绿蓝紫的顺序把1~n^2依次添加进行代码class Solution { public static int[][] generateMatrix(int n) { int[][] matrix = new int[n][n]; int value = 1; int row1 = 0, row2 = n-1; int col1 = 0, col2 = n-1; while(row1<=r原创 2021-03-16 10:33:06 · 40 阅读 · 0 评论 -
第54题:螺旋矩阵
解题思路54. 螺旋矩阵对于每个二维数组,都按照图中所示的红绿蓝紫依次遍历,然后不断收缩,继续以相同方式遍历里面的小二维数组。因为二维数组就是个矩阵,收缩矩阵就要定义上下左右四个边界。代码class Solution { public static List<Integer> spiralOrder(int[][] matrix) { List<Integer> result = new ArrayList<>(); //存储结果原创 2021-03-16 10:32:16 · 65 阅读 · 0 评论 -
第58题:最后一个单词的长度
解题思路58. 最后一个单词的长度思路一:把字符串以空格分开,然后计算出最近一串字母的长度思路二:从后向前遍历直到遍历到头或者遇到空格为止代码方法一:分割字符串//运行时间:4ms , 内存消耗:37.2MBclass Solution { public static int lengthOfLastWord(String s) { String str = s.trim(); if(str.length() == 0 ) return 0; String[] str原创 2021-03-16 10:31:47 · 30 阅读 · 0 评论 -
第234题:回文链表
解题思路234. 回文链表暴力方法:遍历链表中的每一个元素,依次加入到StringBuffer里,然后利用StringBuffer特有的reverse方法对其进行倒序,最后比较倒序前后的字符串内容是否相同,相同为true,否则为false。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {}原创 2021-03-16 10:30:53 · 66 阅读 · 0 评论 -
第9题:回文数
解题思路9. 回文数很显然,负数必定不是回文数,0为回文数。方法一:可以利用StringBuffer特有的reverse方法把x所对应的字符串倒序处理,然后比较倒序前后是否相同,相同就为回文数。方法二:使用取模运算把整数x的尾数一个一个取出来,然后反向拼接处一个数字,最后比较两数字是否相等,相等就为回文数。代码方法一://运行时间:14ms 内存消耗:38.2MBclass Solution { public static boolean isPalindrome(int x)原创 2021-03-16 10:30:21 · 224 阅读 · 0 评论 -
第7题:整数反转
解题思路7. 整数反转起始思路很笨拙:思路一把数值都变成正数处理,因为后续数据转换过程中如果存在负数符号会报错,但要用标志位标记一下负号再转换成正数利用StringBuffer特有的倒序方法对数值进行倒序处理,倒序后要把开头的0全部删除,然后比较倒序后的数据是否超出了int的表示范围,超出了就返回0然后就是把数值转换成int类型,然后通过标志位来判断是负数还是正数。思路二:我们只要能拿到这个整数的 末尾数字 就可以了:通过取模运算。以12345为例,先拿到5,再拿到4,之后是3,2,1,原创 2021-03-16 10:29:53 · 42 阅读 · 0 评论 -
第3题:无重复字符的最长子串
解题思路3. 无重复字符的最长子串先来说下解题经历:开始考虑得太片面,出错了好多次,每出错一次,然后根据系统给出的出错的示例进行修正,总的来说,就是经过一次又一次的失败,从每次失败中吸取经验,最终完成了,代码有点混乱,算法有点粗糙,因为是经过反复修改才写出来的,还没来得及优化,想着先来记录下感想与经历。哈哈0.0.思路简单大概性的描述:使用滑动窗口用二个int变量来标记字符串中字符移动的位置,begin起始为0,变量i不断前移,当碰到和已经遍历过的字符相同的字符,那么就计算出现在子串的长度(即i-原创 2021-03-16 09:34:48 · 42 阅读 · 0 评论 -
第36题:有效的数独
解题思路36. 有效的数独题目要求判断九宫格中的任意数字在它所在行、列以及3*3宫格内只出现一次可以使用以下三种方法解决:使用哈希表HashSet、List(ArrayList和LinkedList)使用boolean数组使用比特进行位运算代码方法一:使用哈希表HashSet//运行时间:3ms 内存消耗:38.4MBclass Solution { public boolean isValidSudoku(char[][] board) { //把九行、九原创 2021-03-16 09:33:59 · 121 阅读 · 0 评论 -
第347题:前K个高频元素
解题思路347. 前 K 个高频元素大体思路:①先要计算出各数字所出现的频次。数字:频次。可见这是一个键值对形式,所以可以用双列集合Map来存储。② 找到频次前K高个数值对于②的实现有很多方法,下面给出了三种解法。使用数组进行全排序使用优先级队列进行排序使用桶排序代码方法一:全排序//运行时间:17 ms 内存消耗:41.2MBimport java.util.Map.Entry;class Solution { public int[] topKFrequent(i原创 2021-03-16 09:33:28 · 73 阅读 · 0 评论 -
第198题:打家劫舍
解题思路198. 打家劫舍此题的求解思路跟斐波那契数列的求解思路是相同的。如果从第k号房子开始从后往前偷,第K号房子可以有二种情况:偷或者不偷。这唯一的二种情况就会出现二种不同的金额,选择较大的金额就是从第k号房子开始从后往前偷所能偷到的最大金额。下面是官方的题解思路,感觉很不错!!!首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。如果原创 2021-03-16 09:32:57 · 121 阅读 · 0 评论 -
第114题:二叉树展开为链表
解题思路114. 二叉树展开为链表思路一:先序遍历根据题目要求:展开后的单链表应该与二叉树 先序遍历 顺序相同。所以可以考虑使用先序遍历出来二叉树中的每一个节点进行处理:把每一个节点的左子树移动到右边作为新的右子树,然后把左子树清空,接着把原来的右子树嫁接到新的左子树的最右边的节点后(因为按照先序遍历的顺序,左边的节点都遍历完才轮到右边的节点)。思路二:后序遍历使用后序遍历:右,左,根的方式进行遍历。这样的话会发现遍历结束后的节点顺序和题目的要求刚好是相反的,所有要进行这样的处理:每遍历一个节点就原创 2021-03-16 09:32:27 · 81 阅读 · 0 评论 -
第124题:二叉树中的最大路径和
解题思路124. 二叉树中的最大路径和最大路径和S:提供给父节点的最大路径值V:解决该题的关键在于搞清楚SB和VB的区别和联系。其中S^B = B+max(V^D ,0)+max(V^E,0) , 而V^B = B+max(max(V^D ,0),max(V^E,0)),这二者之间的区别在于:S^B:B的最大路径和 = B的值+D所能提供的最大路径值+E所能提供的最大路径值。V^B:B所能提供给其父节点A的最大路径值=B的值+D和E中所能提供给B的最大路径值的更大的值。格式中反复用到ma原创 2021-03-16 09:31:53 · 52 阅读 · 0 评论