medium
puspos
这个作者很懒,什么都没留下…
展开
-
494. 目标和
问题给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。例子思路方法1回溯方法2代码//方法1class Solution { private int res = 0;...原创 2020-05-18 09:23:42 · 389 阅读 · 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 · 164 阅读 · 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 · 123 阅读 · 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 · 516 阅读 · 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 · 135 阅读 · 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 · 118 阅读 · 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 · 88 阅读 · 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 · 123 阅读 · 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 · 98 阅读 · 0 评论 -
71. 简化路径
问题例子思路//->//.->//a/..->/最后一个不能是/方法1split("/")->"", “.”, “xx”, “…”遍历数组arr,如果是"…",就把栈顶弹出,如果不是""和“."就放入栈方法2代码//方法1class Solution { public String simplifyPath(String path) { String[] arr = path.split("/"原创 2020-05-12 20:25:24 · 140 阅读 · 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 · 132 阅读 · 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 · 88 阅读 · 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 · 257 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针_117. 填充每个节点的下一个右侧节点指针 II
116. 填充每个节点的下一个右侧节点指针问题给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。例子思路完美二叉树:除了叶子结点之外的每一个结点都有两个孩子结点方法1方法2117. 填充每个节点的下一个右侧节点指针 II问题不是完美二叉树代码原创 2020-05-11 23:24:01 · 161 阅读 · 0 评论 -
86. 分隔链表
问题给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。例子思路方法1新创一个链表,遍历原链表,后插法用新链表保存所有<x的结点,并删除原来链表的所有<x的结点要点:既然删除结点,则必须设置一个头节点,和pre指针方法2代码//方法1class Solution { public ListNode partition(ListNode head, int原创 2020-05-11 18:22:57 · 80 阅读 · 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 · 151 阅读 · 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 · 94 阅读 · 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 · 133 阅读 · 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 · 111 阅读 · 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 · 202 阅读 · 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 · 115 阅读 · 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 · 131 阅读 · 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 · 121 阅读 · 0 评论 -
109. 有序链表转换二叉搜索树
问题给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。例子思路方法1把有序链表变成有序数组,问题就变成了108题方法2找到中间结点,该结点的值创造根结点,然后从该结点分成前后两截【使用一个指针表示前一段最后一个结点的前一个结点】,分别得到左子树和右子树,返回root代码//方法1class Solution { public TreeNode s原创 2020-05-09 17:41:03 · 127 阅读 · 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 · 104 阅读 · 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 · 80 阅读 · 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 · 84 阅读 · 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 · 565 阅读 · 0 评论 -
103. 二叉树的锯齿形层次遍历——面试题32 - III. 从上到下打印二叉树 III
问题给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例子思路方法1方法2代码//方法1//方法2...原创 2020-05-09 08:38:53 · 210 阅读 · 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 · 89 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
问题例子思路方法1滑动窗口方法2代码//方法1class Solution { public boolean check(int[] arr) { for(int n : arr){ if(n!=0) return false; } return true; } p...原创 2020-04-11 22:39:35 · 117 阅读 · 0 评论 -
131. 分割回文串
问题给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。例子思路方法1回溯查看是不是回文字符串方法2代码//方法1class Solution { public List<List<String>> partition(String s) { List<List...原创 2020-04-09 11:19:26 · 105 阅读 · 0 评论 -
209. 长度最小的子数组
问题给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。例子思路方法1方法2代码//方法1class Solution { public int minSubArrayLen(int s, int[] nums) { if(nums.length...原创 2020-04-07 09:53:06 · 94 阅读 · 0 评论 -
200. 岛屿数量
问题例子思路方法1遍历二维数组,当前位置为‘1’,表明是个新的岛屿,结果数量+1,然后把该岛变成水方法2代码//方法1class Solution { public int numIslands(char[][] grid) { if(grid.length==0) return 0; int res = 0; ...原创 2020-04-03 22:52:50 · 84 阅读 · 0 评论 -
210. 课程表 II
问题例子思路同207课程表,使用数组保存每次删除【确定上】的课程方法1$$$$方法2$$$$代码//方法1class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { int[] res = new int[numCourses];...原创 2020-04-03 12:13:57 · 167 阅读 · 0 评论 -
207. 课程表
问题例子思路课程安排图是否是 有向无环图(DAG)使用拓扑排序(广度遍历,深度遍历)拓扑排序(Topological Sorting)可得到一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列,该序列满足:每个顶点出现且只出现一次。若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。广度遍历使用...原创 2020-04-03 12:11:57 · 97 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期
问题例子思路冷冻:即买入卖出后的over状态每天的状态:当天卖出,当天冷冻,当天买入,当前是买入后的无操作。可压缩为3中状态:当前卖出,当天冷冻,当天持有状态转换:卖出的前一天:必须是持有状态持有的前一天,持有或者是冷冻【因为卖出后,必须冷冻才能再次买入】冷冻的前一天:冷冻或者卖出方法1 O(n) O(n)$$$$方法2 O(n) O(1)$$$$...原创 2020-04-03 10:19:07 · 113 阅读 · 0 评论 -
337. 打家劫舍 III
问题例子思路对于根节点root,偷它时,则不能再偷子结点,只能偷孙子结点如果不偷,可偷子结点比较两种方式哪种偷的多方法1$$$$直接递归方法2$$$$由于有大量的重复计算,所以保存计算的结果代码//方法1 public int rob(TreeNode root) { if(root==null) return 0;...原创 2020-04-02 22:00:38 · 101 阅读 · 1 评论 -
138. 复制带随机指针的链表_面试题35. 复杂链表的复制
问题例子思路直接遍历结点的话,因为random是随机的,有没有创建不知道,所以使用辅助map,旧结点,新结点【遍历结点,复制一份,并放在map中与原结点进行映射】,则原结点之间的映射关系,就是新节点之间的映射关系方法1$$$$方法2$$$$代码//方法1/*// Definition for a Node.class Node { int v...原创 2020-04-02 11:44:51 · 97 阅读 · 0 评论 -
面试题26. 树的子结构
问题例子思路遍历树a,把a的子树结构和b进行比较比较时,只要b进行到null,不管a进行到是不是null,返回true方法1$$$$方法2$$$$代码//方法1class Solution { private boolean res = false; public boolean isSubStructure(TreeNode A, ...原创 2020-04-01 22:14:38 · 121 阅读 · 0 评论