数据结构与算法
文章平均质量分 71
月亮好像心动了❤️
这个作者很懒,什么都没留下…
展开
-
深度遍历实现数字序列全排列(没有重复)
深度遍历实现数字序列全排列(没有重复)参考图的深度优先遍历:先用 n 个数字构建出 n * n 大小的矩阵,然后通过矩阵进行深度遍历通过判断子集中是否包含某一元素,来判断一个元素是否isVisitedpublic class Solution { public static void main(String[] args) { int[] nums = new ...原创 2019-08-07 23:09:31 · 425 阅读 · 0 评论 -
字符串解码
描述:给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[...原创 2019-08-14 22:57:08 · 150 阅读 · 0 评论 -
数组中的第K个最大元素
描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。链接:数组中的第K个最大元素...原创 2019-08-24 15:25:25 · 83 阅读 · 0 评论 -
组合总和 III
描述:找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]思路分析:1、如何提高支剪程...原创 2019-08-11 20:12:47 · 96 阅读 · 0 评论 -
最短无序连续子数组
描述:给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。示例 1:输入: [2, 6, 4, 8, 10, 9, 15]输出: 5解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。思路分析:官方实现之一:将数组排序、然后比较两个数组中最左...原创 2019-08-20 23:36:34 · 75 阅读 · 0 评论 -
找到字符串中所有字母异位词
描述:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。示例 1:输入:s: "cbaebabacd" p: "abc"输出:[0, 6]解释:起始索引等于 0 的...原创 2019-08-21 00:48:37 · 107 阅读 · 0 评论 -
回文链表
描述:请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true思路分析:细节分析:如果只有一个节点1,fast = slow = 1如果有1->2两个节点,fast = null,slow = 2如果有1->2->3三个节点,fast = null,slo...原创 2019-08-21 01:14:43 · 82 阅读 · 0 评论 -
颜色分类
描述:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]来源:力扣(LeetCode)链接:颜色分类思路分析:...原创 2019-08-25 14:22:39 · 100 阅读 · 0 评论 -
完全平方数
描述:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.来源:力扣(LeetCode)链接:完全平方数思路分析:1、标准的动态规划f ...原创 2019-08-25 14:37:46 · 152 阅读 · 0 评论 -
字符串解码
描述:给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[...原创 2019-08-25 17:32:41 · 155 阅读 · 0 评论 -
相交链表
描述:编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (...原创 2019-08-21 14:28:56 · 73 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置
描述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10],...原创 2019-08-26 01:14:02 · 148 阅读 · 0 评论 -
手写死锁demo
代码实现:class HoldLockThread implements Runnable{ private String lockA; private String lockB; public HoldLockThread(String lockA, String lockB) { this.lockA = lockA; this.lo...原创 2019-08-27 16:24:05 · 94 阅读 · 0 评论 -
合并K个排序链表
描述:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6链接:https://leetcode-cn.com/problems/merge-k-sorted-list...原创 2019-09-01 14:31:07 · 65 阅读 · 0 评论 -
字母异位词分组
描述:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。链接:字母异位词分组思...原创 2019-08-23 16:47:57 · 108 阅读 · 0 评论 -
前K个高频元素
描述:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大...原创 2019-08-23 16:14:52 · 268 阅读 · 0 评论 -
二叉树层次遍历(DFS)
题目:给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]/** * Definition for a binary tree node. * public class TreeN...原创 2019-08-08 01:36:18 · 679 阅读 · 1 评论 -
深度遍历实现全排列
题目:给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:1、用一个数组path来记录此时生成的结果子集中,每个位置取数组nums中的哪一个下标2、用idx表示在path中确定到哪一位了,当确定到第3位,然后进入下一层递归、发现id...原创 2019-08-08 13:59:15 · 435 阅读 · 0 评论 -
组合问题(DFS)
题目:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]思路:1、题目要求求子集合、所以子集合中的顺序没有要求2、注意生成子集合时、path数组下标的确定、这里没有使用正常的 idx 作为下标进行确认、因为 idx 在递归的...原创 2019-08-08 14:34:55 · 327 阅读 · 0 评论 -
求数组子集(有重复元素)(DFS)
题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]代码:class Solution { public static List<List<Integer>> ans = ne...原创 2019-08-08 15:49:49 · 436 阅读 · 0 评论 -
求数组子集(无重复元素)(DFS)
题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]思路:1、先前都是使用 path[ ] 数组来记录子结果集,但是在本题中,每一个子结果集的长度并不古蒂昂,所以在recor...原创 2019-08-08 15:59:09 · 638 阅读 · 0 评论 -
路径总和(要求打印出所有路径)
题目:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1...原创 2019-08-08 19:42:41 · 387 阅读 · 0 评论 -
不同路径(存在障碍)
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[[0,0,0]...原创 2019-08-08 23:15:59 · 403 阅读 · 0 评论 -
解码方式
题目:一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: “12”输出: 2解释: 它可以解码为 “AB”(1 2)或者 “L”(12)。示例 2:输入: “226”输出: 3解释: 它可以解码为 “BZ” (2 26), “VF...原创 2019-08-09 00:18:06 · 1016 阅读 · 0 评论 -
验证二叉搜索树
题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,nu...原创 2019-08-09 00:47:05 · 77 阅读 · 0 评论 -
翻转一棵二叉树
题目:示例:输入: 4/ 2 7/ \ / 1 3 6 9输出: 4/ 7 2/ \ / 9 6 3 1思路:1、首先尝试将问题分解出子问题、看是否需要新建helper函数2、原问题:求指定根节点的翻转二叉树3、子问题:求指定根节点的左子树的翻转二叉树和右节点的翻转二叉树4、都是求一个节点往下的翻转二叉树,所以...原创 2019-08-09 12:17:15 · 448 阅读 · 0 评论 -
相同的树
描述:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true示例...原创 2019-08-09 12:33:36 · 81 阅读 · 0 评论 -
对称二叉树
描述:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3思路:1、主问题:判断root节点下的两个子树是...原创 2019-08-09 12:37:51 · 74 阅读 · 0 评论 -
找出数组中重复元素最多的数
思路分析:1、遍历数组,放入map中2、key = 数组元素值、value = 该元素值出现的次数3、注意复习HashMap的遍历方式(4种)代码实现:public class Test { public static int fun(int[] nums) { HashMap<Integer, Integer> map = new HashMap&l...原创 2019-08-19 19:17:00 · 540 阅读 · 0 评论 -
寻找两个有序数组的中位数
题目描述给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是...原创 2019-09-13 16:27:42 · 160 阅读 · 1 评论