![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
qq_40396568
这个作者很懒,什么都没留下…
展开
-
LeetCode116. 填充每个节点的下一个右侧节点指针
思路1:递归我们容易想到递归公式为:每一个节点的左孩子节点指向其右孩子终止条件:节点不存在或者左孩子节点不存在直接返回这么做没考虑跨节点的情况,比如节点5的next应该指向节点6。完善:函数参数为两个递归公式:node1.next=node2;connect(node1.left,node1.right);connect(node2.left,node2.right);connect(node1.right,node2.left)class Solution { p..原创 2021-12-01 21:29:38 · 60 阅读 · 0 评论 -
LeetCode114. 二叉树展开为链表
思路1:迭代法。首先找到根节点的左子树的最右节点mRight,将根节点的右子树root.right接在mRight的右节点上,再把根节点的左子树接回根节点的右子树上,然后判断下一个根节点是否需要"嫁接"。class Solution { public void flatten(TreeNode root) { while(root!=null) { //没有左子树,只需要对右子树操作“嫁接” if(root....原创 2021-11-28 17:23:07 · 155 阅读 · 0 评论 -
144. 二叉树的前序遍历||94. 二叉树的中序遍历||145. 二叉树的后序遍历
二叉树的前序遍历、二叉树的中序遍历、二叉树的后序遍历原创 2021-11-28 16:57:26 · 92 阅读 · 0 评论 -
LeetCode222. 完全二叉树的节点个数
思路1:递归终止条件:树无节点,返回0递归公式:树节点树=根节点+其左子树节点+右子树节点时间O(N) 空间O(N)class Solution { public int countNodes(TreeNode root) { if(root==null) { return 0; } return 1+countNodes(root.left)+countNodes(root.right);原创 2021-11-24 21:52:35 · 272 阅读 · 0 评论 -
LeetCode9. 回文数
思路1:数字转字符串,再使用双指针 数字转字符串String.valueOf(long/int...) Interger/Long.parseInt()/Long() class Solution { public boolean isPalindrome(int x) { String str=String.valueOf(x); int left=0; int right=str.length()-1; ...原创 2021-11-24 00:03:18 · 40 阅读 · 0 评论 -
LeetCode5. 最长回文子串
思路1:暴力破解三循环首先定义判断字符串的子串是否是回文串的函数isFlag,然后双循环遍历,回文子串最小长度为1,因此maxLen定义为1,maxLen记录当前最大的回文子串长度,因为从字符串的头开始,begin定义为0,(j-i+1)为当前子串长度,如果当前子串长度大于当前最小回文子串长度(maxLen)并且当前子串是回文子串,才需要更新子串长度和子串的起始位置class Solution { public String longestPalindrome(String s) {原创 2021-11-20 18:09:06 · 180 阅读 · 0 评论 -
LeetCode125. 验证回文串||判断字符串是否回文
思路:双指针\碰撞指针,这道题加入了特殊字符,所以我们使用Character自带的api过滤掉非数字和字母(平时还是要积累一下常用api)class Solution { public boolean isPalindrome(String s) { int len=s.length(); int left=0; int right=len-1;//为什么是left<right,字符串是偶数,最后left<right,字符串是...原创 2021-11-20 17:12:53 · 233 阅读 · 0 评论 -
LeetCode206. 反转链表
思路1:迭代法(双指针)将原链表节点一个一个摘下,再用头插法插入新链表中,新链表为带头结点(哨兵节点)的带头链表,带头结点的好处是,方便返回链表的首节点。可参照代码和图一起看class Solution { public ListNode reverseList(ListNode head) {//边界判断,链表为空或者一个节点直接返回 if(head==null||head.next==null) { return .原创 2021-11-19 21:16:40 · 306 阅读 · 0 评论 -
LeetCode19. 删除链表的倒数第 N 个结点
和找出链表中倒数第k个节点相似思路1,两次遍历,并且找出需删除的目标节点的前1节点,将其指向该节点的下下节点。class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode temHead = head; int len=0; while(temHead!=null) { temHead=te...原创 2021-11-13 16:24:00 · 233 阅读 · 0 评论 -
LeetCode 23. 合并K个升序链表
此题与合并两个有序链表解法相似;关键在于如何每次快速获得k个链表的最小节点;【优先队列,里面保存k个链表,链表的头结点都是该链表的最小节点】头结点的作用:保存链表表头,方便返回,dummy指向链表的尾节点注意点:队列传入的接口部分实现的比较方法class Solution { public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0) return...原创 2021-11-13 10:34:27 · 255 阅读 · 0 评论 -
LeetCode 20. 有效的括号
给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。1、括号成对,字符个数单数肯定不符合。2、遇见左括号("(","[","{")入栈,遇见右括号 ")","]","}")出栈开始配对,栈内不可能存在右括号,如果栈内存在右括号一定匹配失败3、利用map维护右括号与左括号的成对映射,当然不使用map也可以public class Solution {..原创 2021-11-09 21:58:01 · 4589 阅读 · 0 评论 -
LeetCode103. 二叉树的锯齿形层序遍历 || JZ59 按之字形顺序打印二叉树
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]思路一:层序遍历看到这个比较容易想到层序遍历,但是奇数层和偶数层是逆着来的,那么我们在将每一层的节点加入列表时,加一个判断,如果是奇数层就按照层序遍历来,如果是偶数层那就翻转一下列表代码如下:import java.util.*;public cla.原创 2021-08-19 22:45:29 · 144 阅读 · 0 评论 -
LeetCode415. 字符串相加
题意不允许使用BigInteger或者BigDecimal来存储两数和,要不还是比较简单的,而使用Integer或者Long来存储两数和,则测试数据会发生溢出。思路:小学的竖式加法,按位相加,每次记录下进位和余数,进位计算【指针指向的个位数相加除以10】,余数计算【个位数相加+进位和】。用StringBuffer记录每一次的余数,最后反转。注意点:两数一长一短的情况,必定有一个数先加完,此时为避免指针索引溢出,因此赋值为0.直到两数“加完”。为方便理解,自己可以先在纸上验算一遍竖式加法。num原创 2021-11-08 21:33:10 · 125 阅读 · 0 评论 -
LeetCode21. 合并两个有序链表
解法1:迭代时间O(M+N) MN为链表长度,空间O(1)class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) {//边界判断 if(l1==null) return l2; if(l2==null) return l1; ListNode head=new ListNode(); ListN...原创 2021-11-07 11:57:02 · 46 阅读 · 0 评论 -
LeetCode160. 相交链表
思想:两个人的总路程相等,各自不论从哪个位置开始,如果相交,则必定相遇。如果不相交。则最后都走到终点此时为“null”。边界条件:1、A/B为null2、A、B在首节点相交原创 2021-11-07 11:33:24 · 46 阅读 · 0 评论 -
LeetCode 53. 最大子序和
解法1:暴力破解双循环,超时【原因重复计算累加和】解法2:滑动窗口原创 2021-11-07 09:50:07 · 52 阅读 · 0 评论 -
LeetCode 88. 合并两个有序数组
注意点:有序【题目为递增】思路:从前往后对比,将元素都合并到数组1中。边界:1、数组2无元素,不做操作2、数组1无元素,数组2迁移3、合并之后,数组2还有元素,依次迁移。数组1还有元素,不做操作...原创 2021-11-06 21:16:31 · 4064 阅读 · 0 评论 -
LeetCode 15. 三数之和
一个小时+主要思路:排序+双指针nums[i]为每一次循环的头元素,nums[left] nums[right]为nums[i]的右边元素【其右边的前后指针】先确定一个元素nums【i】+nums【left】+nums【right】由于相同元素是相邻的,于是nums【i】去重则i++,nums【left】去重则left++,nums【right】去重则right--;为什么每确定一个满足条件的组合之后,前后指针要一起移动,因为在nums[i]不动的情况,只有前后指针一起移动才可能找到满足的组合原创 2021-11-05 21:30:46 · 50 阅读 · 0 评论 -
leetcode83. 删除排序链表中的重复元素
保留一个重复节点的值,升序是保证重复元素是相邻的public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead==null || pHead.next==null) return pHead; ListNode head=new ListNode(0); head.next=pHead; Lis...原创 2021-07-31 09:51:00 · 45 阅读 · 0 评论 -
leetcode.102/107 二叉树层序遍历
思路一:bfs宽度优先class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if(root==null) return result; Queue<TreeNode> q..原创 2021-07-26 11:06:38 · 924 阅读 · 1 评论 -
leetcode.200 岛屿数量
这篇题解写得非常好,值得反复看https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/代码如下:答题模板class Solution { public int numIslands(char[][] grid) { if(grid==null && grid.length=...原创 2021-07-23 17:21:02 · 56 阅读 · 0 评论 -
leetcode.22 括号生成
思路一 深度遍历+回溯分析:在遍历树的过程中,右括号的左边一定有左括号,左括号打头终止条件如果右括号个数大于左括号个数,返回如果左括号和右括号等于括号对数,加入结果集,回溯递归如果左括号数小于括号对数,添加左括号如果右括号小于左括号个数,添加右括号代码实现:class Solution { public List<String> generateParenthesis(int n) { List<String...原创 2021-07-21 17:20:49 · 65 阅读 · 0 评论 -
leetcode.78 子集
思路一:扩展法任何集合的子集都存在空集代码实现如下:class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result=new ArrayList<>(); result.add(new ArrayList<Integer>());//初始化一个子集为空集 .原创 2021-07-20 11:50:08 · 80 阅读 · 0 评论 -
leetcode.53 最大子序和
思路一:暴力破解外循环控制子序列的头,内循环控制子序列的尾class Solution { public int maxSubArray(int[] nums) { if(nums.length==1) return nums[0]; int max=Integer.MIN_VALUE; for(int i=0;i<nums.length;i++) { int total=0;原创 2021-07-19 21:30:58 · 1192 阅读 · 2 评论 -
leetcode.169 多数元素
方式一:哈希表class Solution { public int majorityElement(int[] nums) { HashMap<Integer,Integer> map = new HashMap(); for(int i=0;i<nums.length;i++) { if(!map.containsKey(nums[i])) map.put(nums[i]...原创 2021-07-15 12:26:39 · 68 阅读 · 0 评论 -
leetcode.344 反转字符串
方式一:对撞指针(头尾对调)代码实现如下:class Solution { public void reverseString(char[] s) { if(s==null || s.length<=1) return; int i=0; int j=s.length-1; while(i<j) { char ..原创 2021-07-15 11:49:10 · 66 阅读 · 0 评论 -
leetcode.206 翻转链表
思路一:头插法维护一个新的空链表,新建一个空节点,指向当前链表头,不断从当前链表将节点摘下,并插入新链表头部代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNod...原创 2021-07-14 15:54:39 · 53 阅读 · 0 评论 -
leetcode.509 斐波那契数列
斐波那契数列第0步写出递归公式【这个公式是左循环,再右循环递归】f(n)=f(n-1)+f(n-2)第1步 终止条件f(0)=0 f(1)=1代码实现如下:class Solution { public int fib(int n) { if(n==0 || n==1) return n==0?0:1; return fib(n-1)+fib(n-2); }}...原创 2021-07-14 14:37:32 · 53 阅读 · 0 评论 -
leetcode.1456 定长子串中元音的最大数目
题意:给定子串长度k,要求找出子串中最大元音个数这是一个子串定长问题思路一:暴力破解【超出时间限制】暴力破解的时间复杂度是O(n^2),空间复杂度是O(n)直接用charAt不要转数组,空间复杂度就是O(1)class Solution { public int maxVowels(String s, int k) { if(s == null || s=="") return 0; int maxSubLen=-1...原创 2021-07-14 11:38:41 · 158 阅读 · 0 评论 -
leetcode.209 长度最小的子数组
思路一:滑动窗口class Solution { public int minSubArrayLen(int target, int[] nums) { if(nums==null || nums.length==0) return 0; int total=0; int head=0; int end=0; int len=0; int curMinLen=nu原创 2021-07-13 16:18:53 · 43 阅读 · 0 评论 -
leetcode.74 搜索二维矩阵
方法1:将”有序“的二维矩阵(数组),当作有序的一维数组来处理,时间复杂度O(log(row*column))class Solution { public boolean searchMatrix(int[][] matrix, int target) { int row=matrix.length; int column=matrix[0].length; int left=0; int right=row*c...原创 2021-07-13 11:52:34 · 70 阅读 · 0 评论 -
leetcode.35 搜索查找位置
这是一个方法:但总觉得不容易表达,写起来和二分非常相似class Solution { public int searchInsert(int[] nums, int target) { int left=0; int right=nums.length-1; int mid=0; while(left<=right) { mid=left+(right-left)/2; ..原创 2021-07-13 09:04:25 · 60 阅读 · 0 评论 -
leetcode.704 二分查找
class Solution { public int search(int[] nums, int target) { if(nums==null || nums.length==0) return -1; int left=0; int right=nums.length-1; int mid=0; while(left<=right) { mid=le.原创 2021-07-13 08:25:58 · 48 阅读 · 0 评论 -
leetcode.162 求峰值
题意:只要有元素就一定有峰值 因为任意相邻元素不等,及数组前后是负无穷思路:二分查找中间值,如果arr[mid]>arr[mid+1] 峰值肯定在mid及其左边,右边丢弃,right=mid;如果arr[mid]<arr[mid+1] 峰值肯定在mid+1及其右边,左边丢弃,left=mid+1;当left==right 这个arr[left]即为峰值方法一:遍历(暴力破解)class Solution { public int fin...原创 2021-07-12 17:09:15 · 53 阅读 · 0 评论 -
leetcode.1 两数之和
给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。【也就是每一个位置的元素只能出现一次】你可以按任意顺序返回答案。示例1输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例2输入:n...原创 2021-07-11 10:57:28 · 52 阅读 · 0 评论 -
leetcode.692 前K个高频单词
class Solution { public List<String> topKFrequent(String[] words, int k) { //字符串键值和频率存入hashtable,都是作为比较的要素 HashMap<String,Integer> map = new HashMap(); for(String s:words) { if(!map.containsKey(s.原创 2021-07-11 09:47:00 · 75 阅读 · 0 评论