刷遍LeetCode和LintCode
dp小王子
讲真的,写博客好累。。。
展开
-
组合总和 II
【题目】给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。public static List<List<Integer>> combinationS...原创 2019-03-11 19:50:02 · 116 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。public class SearchRange { public int[] searchRange(int[] nums, int target) { int[] res ...原创 2019-03-17 17:31:00 · 250 阅读 · 0 评论 -
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。public class SearchInsert { public int searchInsert(int[] nums, int target) { if (nums == null || nums.length == 0) { ...原创 2019-03-17 17:31:25 · 92 阅读 · 0 评论 -
有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。 public boolean isValidSudoku(char[][] board) { int ro...原创 2019-03-17 17:31:45 · 147 阅读 · 0 评论 -
实现x的n次幂
实现 pow(x, n),即计算 x 的 n 次幂函数public class MyPow { public double myPow(double x, int n) { if(n == Integer.MIN_VALUE){ return Math.abs(x) == 1 ? 1 : 0; } if (n == 0) { return 1; } if (n ...原创 2019-03-17 17:32:33 · 858 阅读 · 0 评论 -
字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], [&原创 2019-03-17 17:59:36 · 78 阅读 · 0 评论 -
有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9...原创 2019-03-21 17:22:55 · 121 阅读 · 0 评论 -
路径总和I.II
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 ...原创 2019-03-21 17:24:08 · 121 阅读 · 0 评论 -
二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.public class MinDepth { public class TreeNod...原创 2019-03-21 17:24:33 · 86 阅读 · 0 评论 -
二叉树展开为链表
给定一个二叉树,原地将它展开为链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6思路:采用后序遍历,将左子树放在右子树的位置上,然后再把右子树跟在左子树最右节点的右子树上。...原创 2019-03-21 17:25:02 · 204 阅读 · 0 评论 -
下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1public class NextPermutation {...原创 2019-03-17 17:30:38 · 98 阅读 · 0 评论 -
移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。public class RemoveElement { public int removeElement(int[] nums, ...原创 2019-03-17 17:30:16 · 199 阅读 · 0 评论 -
二叉树最大深度-层遍历实现
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。public class MaxDepth { public static class TreeNode { public int val; public TreeNode left; public TreeNode right; public T...原创 2019-03-20 20:54:42 · 320 阅读 · 0 评论 -
比特位计数
【题目】给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 public int[] countBits(int num) { int[] dp = new int[num + 1]; dp[0] = 0; for (int i = 1; i <= num; i++) { if (i % 2...原创 2019-03-12 17:34:37 · 96 阅读 · 0 评论 -
两数相加
【题目】给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -&...原创 2019-03-12 17:35:00 · 91 阅读 · 0 评论 -
全排列II
【题目】给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[ [1,1,2], [1,2,1], [2,1,1]]public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> res = new ...原创 2019-03-12 17:35:23 · 221 阅读 · 0 评论 -
括号生成
【题目】给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]public List<String> generateParenthesis(int n) { ArrayLis原创 2019-03-12 17:35:46 · 128 阅读 · 0 评论 -
盛最多水的容器
【题目】给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。**说明:**你不能倾斜容器,且 n 的值至少为 2。public int maxArea(int[] height) { if (hei...原创 2019-03-12 17:36:25 · 102 阅读 · 0 评论 -
为运算表达式设计优先级
【题目】给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。public class DiffWaysToCompute { public List<Integer> diffWaysToCompute(String input) { ArrayList<Integ...原创 2019-03-12 18:14:29 · 244 阅读 · 0 评论 -
两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) { return head; } ListNode pre = null; ListNo...原创 2019-03-17 17:29:29 · 122 阅读 · 0 评论 -
删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。public class RemoveDuplicates { public int removeDuplicates(int[] nums) { if (nums == null || nums.le...原创 2019-03-17 17:29:48 · 77 阅读 · 0 评论 -
二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历).public class LevelOrderBottom { public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }...原创 2019-03-21 17:25:24 · 118 阅读 · 0 评论 -
链表随机节点
给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。public class Solution_sushuichi { public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } Random ran; ListNode head...原创 2019-03-13 15:29:19 · 487 阅读 · 0 评论 -
加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。public int[] plusOne(int[] digits) { if (digits.length == 0 || digits == null) { return digits; } f...原创 2019-03-18 23:26:29 · 131 阅读 · 0 评论 -
矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法**。**public class SetZeroes { public void setZeroes(int[][] matrix) { boolean[] row = new boolean[matrix.length]; boolean[] col = new boolean[m...原创 2019-03-18 23:26:47 · 115 阅读 · 0 评论 -
矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法**。**public class SetZeroes { public void setZeroes(int[][] matrix) { boolean[] row = new boolean[matrix.length]; boolean[] col = new boolean[m...原创 2019-03-18 23:26:47 · 112 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置...原创 2019-03-22 21:21:42 · 167 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置...原创 2019-03-22 21:21:42 · 127 阅读 · 0 评论 -
杨辉三角
给定一个非负整数 *numRows,*生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。public List<List<Integer>> generate(int numRows) { List<List<Integer>> res = new ArrayList<>(); if (n...原创 2019-03-22 21:22:10 · 191 阅读 · 0 评论 -
重排链表
给定一个单链表 L:L0→L1→…→L**n-1→Ln ,将其重新排列后变为: L0→L**n→L1→L**n-1→L2→L**n-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5,...原创 2019-03-26 23:07:57 · 134 阅读 · 0 评论 -
排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4public class SortList { public class ListNode { int val; ListNode next; ListNode(int x) { val = ...原创 2019-03-26 23:08:17 · 130 阅读 · 0 评论 -
逆波兰表达式求值
根据[逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3) = 9publi...原创 2019-03-26 23:08:33 · 198 阅读 · 0 评论 -
旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5-&...原创 2019-03-18 23:26:07 · 81 阅读 · 0 评论 -
最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。**说明:**一个单词是指由字母组成,但不包含任何空格的字符串。示例:输入: "Hello World"输出: 5public class LengthOfLastWord { public int lengthOfLastWord(String s) { if (...原创 2019-03-18 23:25:48 · 94 阅读 · 0 评论 -
随机数索引
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。注意:数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。public class RandomIndex { int[] nums; public RandomIndex(int[] nums) { this.nums = nums; } public in...原创 2019-03-13 15:29:57 · 467 阅读 · 0 评论 -
最接近原点的 K 个点
【题目】我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。public class KClosest { int[][] points; public int[][] kClosest(int[][] points, int...原创 2019-03-13 16:21:39 · 357 阅读 · 0 评论 -
在二叉树中分配硬币
给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点。)。返回使每个结点上只有一枚硬币所需的移动次数。public class DistributeCoins { publi...原创 2019-03-13 16:56:20 · 153 阅读 · 0 评论 -
杨辉三角II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。public List<Integer> getRow(int rowIndex) { List<Integer> res = new ArrayList<Integer>(); for (int i = 0; i <= row...原创 2019-03-25 17:31:19 · 250 阅读 · 0 评论 -
三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。public class MinimumTotal { public int minimumTotal(List<...原创 2019-03-25 17:31:45 · 365 阅读 · 0 评论 -
买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交...原创 2019-03-25 17:32:08 · 121 阅读 · 0 评论