![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 61
puspos
这个作者很懒,什么都没留下…
展开
-
206. Reverse Linked List 反转链表
问题解法1. 递归 O(N)class Solution { //head没有反转的部分的第一个节点,prev已经反转的链表的第一个节点 public ListNode reverseList(ListNode head, ListNode prev) { //此时全部节点反转 if(head==null) return prev; //将head节点反转,并将其后面的节点继续反转(同时传入已经反转的部分) ListNode nex原创 2021-09-28 21:46:59 · 154 阅读 · 0 评论 -
494. 目标和
问题给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。例子思路方法1回溯方法2代码//方法1class Solution { private int res = 0;...原创 2020-05-18 09:23:42 · 367 阅读 · 0 评论 -
127. 单词接龙
问题例子思路问题抽象为无向无权图,单词为结点,差一个字母的单词之间连边。问题变成找到从起点到终点的最短路径,如果存在的话。因此可以使用广度优先搜索方法。递归深度遍历,超时所以考虑采用广度遍历方法1方法2代码//方法1 我的dfs 超时class Solution { private int res = Integer.MAX_VALUE; public int ladderLength(String beginWord, String endWord原创 2020-05-14 11:45:32 · 151 阅读 · 0 评论 -
147. 对链表进行插入排序
问题对链表进行插入排序。例子思路方法1用指针sorted指向已经排序的最后一个位置因为要插入,所有需要头结点和一个pre指针方法2代码//方法1class Solution { public ListNode insertionSortList(ListNode head) { if(head==null || head.next==null) return head; ListNode h = new ListNode(-原创 2020-05-13 20:28:07 · 106 阅读 · 0 评论 -
186. 翻转字符串里的单词 II
问题给定一个字符串,逐个翻转字符串中的每个单词。例子思路方法1先把各单词反转,然后整个数组反转方法2代码//方法1class Solution { public void reverseWords(char[] s) { int begin=0; for(int i=0; i<s.length; i++) { if(s[i]==' ') { if(i-1>=0原创 2020-05-13 17:47:53 · 495 阅读 · 0 评论 -
165. 比较版本号
问题例子思路存在前导零," 01"==11.0 11.1 1方法1方法2代码//方法1class Solution { public int compareVersion(String version1, String version2) { String[] arr1 = version1.split("\\."); String[] arr2 = version2.split("\\."); int i=0原创 2020-05-13 17:31:29 · 117 阅读 · 0 评论 -
173. 二叉搜索树迭代器
问题例子思路方法1使用队列保存递增数组,为什么用队列?因为方便,直接poll即可,但缺点是空间复杂度是O(n)而不是O(logn)方法2使用栈,初始保存所有的左子树。获取next时,取栈顶元素的值,并把下一个最小的大于该值的结点放入栈next方法:看起来是O(n),其实是O(1),因为其中的循环加上初始化的循环,共放入栈中n个元素,总共会有O(n)次操作,均摊到每一次next()的话平均时间复杂度则是O(n)/n=O(1)代码//方法1class BSTIte原创 2020-05-13 16:43:17 · 102 阅读 · 0 评论 -
90. 子集 II
问题例子思路方法1方法2代码//方法1 我自己的class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> list = new ArrayList<>(); list.add(new ArrayList<Integer>(原创 2020-05-13 16:04:55 · 78 阅读 · 0 评论 -
270. 最接近的二叉搜索树值
问题例子思路方法1二叉搜索树,考虑类似二分,减少操作方法2代码//方法1class Solution { private double dist=Double.MAX_VALUE; private int res=0; public int closestValue(TreeNode root, double target) { preOrder(root,target); return res; }原创 2020-05-13 11:06:59 · 265 阅读 · 0 评论 -
243. 最短单词距离
问题给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离。例子思路方法1方法2代码//方法1class Solution { public int shortestDistance(String[] words, String word1, String word2) { //初始距离要设置的足够远,若w1=0,w2=words.lenth,万一第一个就是w2 int w1=-words.len原创 2020-05-13 10:56:34 · 649 阅读 · 0 评论 -
266. 回文排列
问题给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。例子思路方法1奇数个的字符为1个或者0个方法2代码//方法1class Solution { public boolean canPermutePalindrome(String s) { int[] arr = new int[128]; for(int i=0;i<s.length(); i++) { char c =原创 2020-05-13 10:46:53 · 243 阅读 · 0 评论 -
95. 不同的二叉搜索树 II
问题给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。例子思路方法1获取左子树集合和右子树集合,轮番组成树方法2代码//方法1class Solution { public List<TreeNode> generateTrees(int n) { if(n==0) return new ArrayList<TreeNode>(); return generate(1,n);原创 2020-05-12 21:28:33 · 107 阅读 · 0 评论 -
130. 被围绕的区域
问题例子思路方法1首先对边界上每一个’O’做深度优先搜索【朝着四面搜索】,将与其相连的所有’O’改为’-’。然后遍历矩阵,将矩阵中所有’O’改为’X’,将矩阵中所有’-‘变为’O’方法2代码//方法1class Solution { public void solve(char[][] board) { if(board==null || board.length==0) return ; int m=board.length,原创 2020-05-12 20:57:11 · 86 阅读 · 0 评论 -
71. 简化路径
问题例子思路//->//.->//a/..->/最后一个不能是/方法1split("/")->"", “.”, “xx”, “…”遍历数组arr,如果是"…",就把栈顶弹出,如果不是""和“."就放入栈方法2代码//方法1class Solution { public String simplifyPath(String path) { String[] arr = path.split("/"原创 2020-05-12 20:25:24 · 115 阅读 · 0 评论 -
129. 求根到叶子节点数字之和
问题例子思路方法1先序遍历:sb回溯,方法2先序遍历:不用回溯代码//方法1class Solution { private int res=0; public int sumNumbers(TreeNode root) { if(root==null) return 0; backtrack(root, new StringBuilder()); return res; } publi原创 2020-05-12 18:18:00 · 116 阅读 · 0 评论 -
80. 删除排序数组中的重复项 II
问题给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。例子思路方法1方法2每个元素最多出现两次意味着:nums[i]!=nums[i-2]代码//方法1 我的class Solution { public int removeDuplicates(int[] nums) { if(nums原创 2020-05-12 16:12:14 · 75 阅读 · 0 评论 -
81. 搜索旋转排序数组 II
问题例子思路方法1方法2代码//方法1class Solution { public boolean search(int[] nums, int target) { if(nums==null || nums.length==0) return false; int i=0,j=nums.length-1; while(i<=j) { //处理重复数字 1,1,3,1原创 2020-05-12 10:52:09 · 240 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针_117. 填充每个节点的下一个右侧节点指针 II
116. 填充每个节点的下一个右侧节点指针问题给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。例子思路完美二叉树:除了叶子结点之外的每一个结点都有两个孩子结点方法1方法2117. 填充每个节点的下一个右侧节点指针 II问题不是完美二叉树代码原创 2020-05-11 23:24:01 · 142 阅读 · 0 评论 -
86. 分隔链表
问题给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。例子思路方法1新创一个链表,遍历原链表,后插法用新链表保存所有<x的结点,并删除原来链表的所有<x的结点要点:既然删除结点,则必须设置一个头节点,和pre指针方法2代码//方法1class Solution { public ListNode partition(ListNode head, int原创 2020-05-11 18:22:57 · 69 阅读 · 0 评论 -
93. 复原IP地址
问题给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。例子思路关键点:每个整数处于[0, 255]不能出现以0开头的两位以上整数,比如012,08…方法1暴力方法2回溯代码//方法1class Solution { public List<String> restoreIpAddresses(String s) {原创 2020-05-11 11:00:14 · 135 阅读 · 0 评论 -
120. 三角形最小路径和
问题例子思路有从顶到下,和从下到上,其中从下到上更方便原因:从顶到下要处理特殊情况从下到上方法1方法2代码//方法1 从顶到下 空间复杂度O(n^2)class Solution { public int minimumTotal(List<List<Integer>> triangle) { if(triangle==null || triangle.size()==0) return 0; int[][]原创 2020-05-10 19:30:48 · 79 阅读 · 0 评论 -
162. 寻找峰值
问题例子思路要求时间复杂度为:O(logn),则一定是用二分查找如何二分?nums[mid]<nums[mid+1]时,mid+1~len-1一定存在峰值,此时mid+2只有两种可能。一:小于mid+1,那么mid+1就是峰值二:大于mid+1,则继续向右推,如果一直到数组的末尾都是大于的,那么可以肯定最后一个元素是峰值,因为nums[nums.length]=负无穷方法1方法2代码//方法1class Solution { public int原创 2020-05-10 17:34:14 · 118 阅读 · 0 评论 -
139. 单词拆分
问题例子思路dp[i]为在s中截止到下标i-1,是否truedp[i]=dp[j]==true && s[j,i]是否在list中方法1方法2代码//方法1class Solution { public boolean wordBreak(String s, List<String> list) { boolean[] dp = new boolean[s.length()+1];原创 2020-05-10 16:49:23 · 98 阅读 · 0 评论 -
91. 解码方法
问题例子00->0, 01->0, 100->0思路类似跳台阶dp[n]=dp[n-1]+dp[n-2]但是由限制条件:如果当前数字不是0,可以通过dp[i-1]得到,是0,就不能通过dp[i-1]得到如果和前一个数字组合为:10~26,则可以通过dp[i-2]得到,否则,不能通过dp[i-2]得到方法1方法2代码//方法1class Solution { public int numDecodings(String s) {原创 2020-05-10 16:28:49 · 187 阅读 · 0 评论 -
134. 加油站
问题例子思路方法1方法2代码//方法1class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { //rest为从下标0到i剩余油量,run为从起点到i剩余油量 int rest=0,run=0,start=0; for(int i=0; i<gas.length; i++) { run += gas[原创 2020-05-10 10:45:04 · 101 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树
问题根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素例子思路方法1类似105,后序遍历最后一个是根结点的值,该值把中序遍历分为两半方法2代码//方法1class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { return make(inorder,0,inorder.length-1,postorder,0,postor原创 2020-05-09 19:45:24 · 118 阅读 · 0 评论 -
152. 乘积最大子数组
问题例子思路难点:当只保留到i下标的最大值时,[-2,3,-4],得到24而不是3,怎么办?保留到i下标的最大值和最小值方法1方法2代码//方法1class Solution { public int maxProduct(int[] nums) { if(nums.length==0) return 0; int imax=1,imin=1;//到i下标之前最大的和最小的 int max = Integer.MIN_V原创 2020-05-09 18:35:52 · 106 阅读 · 0 评论 -
109. 有序链表转换二叉搜索树
问题给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。例子思路方法1把有序链表变成有序数组,问题就变成了108题方法2找到中间结点,该结点的值创造根结点,然后从该结点分成前后两截【使用一个指针表示前一段最后一个结点的前一个结点】,分别得到左子树和右子树,返回root代码//方法1class Solution { public TreeNode s原创 2020-05-09 17:41:03 · 107 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
问题给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。例子思路方法1非递归,两个指针,方便删除最后一个结点方法2递归代码//方法1class Solution { public ListNode deleteDuplicates(ListNode head) { if(head==null || head.next==null) return head; ListNode h = new L原创 2020-05-09 16:12:38 · 90 阅读 · 0 评论 -
199. 二叉树的右视图
问题给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。例子思路方法1层次遍历,每层的最后一个。如果是左视图,可层次遍历每层的第一个方法2代码//方法1class Solution { public List<Integer> rightSideView(TreeNode root) { if(root==null) return new ArrayList<Integer>();原创 2020-05-09 11:26:57 · 65 阅读 · 0 评论 -
229. 求众数 II
问题给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。例子思路方法1>1/3的数,最多为2个,根据投票法,选出来两个最多的,然后把>1/3的数放入list方法2代码//方法1class Solution { public List<Integer> majorityElement(int[] nums) { List<Int原创 2020-05-09 11:20:02 · 70 阅读 · 0 评论 -
222. 完全二叉树的节点个数
问题给出一个完全二叉树,求出该树的节点个数。例子思路方法1不管是不是完全二叉树都可以用方法2利用完全二叉树特性:满二叉树个数:2^h-1,左右子树高度差不超过1如果左子树高度==右子树高度,则:左子树是满的,结点个数为:2^dep_left-1+1(根),然后计算右子树的个数如果左子树高度!=右子树高度,则说明右子树是满的,但是高度比左子树低,结点个数为:2^dep_right-1+1(根),然后计算左子树的个数代码//方法1class Solution {原创 2020-05-09 09:51:45 · 541 阅读 · 0 评论 -
103. 二叉树的锯齿形层次遍历——面试题32 - III. 从上到下打印二叉树 III
问题给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例子思路方法1方法2代码//方法1//方法2...原创 2020-05-09 08:38:53 · 186 阅读 · 0 评论 -
33. 搜索旋转排序数组
问题假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。假设数组中不存在重复的元素。要求时间复杂度O(log n)例子思路因为要求时间复杂度为O(logn),所以为二分法方法1数组可以从中间分为有序和无序的。中间数<最右边的数?如果是,表明[mid,]为有序,否则[,mid]为有序看目标数是否在有原创 2020-05-08 17:53:26 · 74 阅读 · 0 评论 -
168. Excel表列名称
问题给定一个正整数,返回它在 Excel 表中相对应的列名称。例子思路方法1两个关键点:一:A-Z==1-26,减了一,则就是从0开始了,0-25对应者’A’-‘Z’,就是标准的26进制了跟转换为10进制一样,区别是每次都让n-=1【得到第二个字母时可以看成对一个新的n进行convertToTitle操作。】二:n–,还是n-1?如果是n-1, (26-1)%2...原创 2020-05-08 16:14:44 · 116 阅读 · 0 评论 -
204. 计数质数
问题统计所有小于非负整数 n 的质数的数量。例子思路方法1质数的所有倍数都不是质数方法2代码//方法1class Solution { public int countPrimes(int n) { int[] arr = new int[n]; Arrays.fill(arr,1); for(int i...原创 2020-05-08 15:21:46 · 81 阅读 · 0 评论 -
299. 猜数字游戏
问题例子思路方法1方法2代码//方法1class Solution { public String getHint(String secret, String guess) { int n = 0;//公牛的数目 int nn = 0;//母牛的数目 int[] arr = new int[10]; ...原创 2020-05-08 09:59:04 · 153 阅读 · 0 评论 -
278. 第一个错误的版本
问题假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。你应该尽量减少对调用 API 的次数。返回true是错误的版本例子思路方法1方法2代码//方法1/* The isBadVersion ...原创 2020-05-08 09:16:25 · 116 阅读 · 0 评论 -
263. 丑数
问题丑数就是只包含质因数 2, 3, 5 的正整数。例子思路方法1<1为false不断除以2,3,5,如果最终结尾是1就为true,否则为false方法2代码//方法1class Solution { public boolean isUgly(int num) { if(num<1) return false; ...原创 2020-05-08 09:05:20 · 91 阅读 · 0 评论 -
258. 各位相加
问题给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?例子思路当<10时,直接返回否则:结果为1~9x=100a+10b+c=99a+9b+a+b+c=99a+9b+9d+fx=100a+10b+c=99a+9b+a+b+c=99a+9b+9d+fx=100a+10b+c=99a+9b+...原创 2020-05-07 18:09:07 · 71 阅读 · 0 评论