数据结构与算法
梦想远航
既往不恋,纵情向前
展开
-
LeetCode 102 103二叉树层序遍历和锯齿形层次遍历
层序遍历题目描述给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]解答:利用广度优先搜索,单向队列即可实现。压入根节点...原创 2019-03-19 13:24:25 · 173 阅读 · 0 评论 -
Leetcode 贪心算法 jump-game
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。 示例 2:输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 ...原创 2018-05-07 19:55:18 · 259 阅读 · 0 评论 -
设计实现一个LRU结构 附代码
问题参考左神算法 双向队列+HashMap实现 一、先定义双向链表节点Node。 二、再定义双向链表容器DoubleLinkedList,有成员变量,容量大小,头节点引用Head,有删除,插入,查询方法。 三、实现自己的LRU缓存结构MyCache查询,删除,插入的效率都是O(1)...原创 2018-05-14 11:50:00 · 630 阅读 · 0 评论 -
左神算法 最短字符子串
刚开始的代码是这样的,发现在测试用例 bba ab 下输出是b。原因是在if (map.containsKey(s[right])) { map.put(s[right], map.get(s[right]) - 1); match--; }这里,right到第二个b的时候,发现b也是包含在map中...原创 2018-05-07 16:29:16 · 338 阅读 · 0 评论 -
左神算法 设计一个具有setAll功能的哈希表
题目】 哈希表常见的三个操作是put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有的记录的value值都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。【基本思路】 加入时间戳。 1、把每一个记录都加上一个时间,...原创 2018-05-03 23:08:23 · 429 阅读 · 0 评论 -
TopK问题 新要求
n个数的无序数组 求第k大 要求不能改变顺序 时间尽可能快 空间O(1),这个问题下次可以好好讨论下的。之前提过topK问题,能用堆排序和快速排序,但是这道题的要求,不改变顺序不能用快速排序,空间复杂度是1不能用堆排序。先遍历一遍,找最大最小,二分答案二分一个数(可能这个数不在数组里) 去遍历小于他的数有几个...原创 2018-05-01 17:06:42 · 250 阅读 · 0 评论 -
求最大子矩阵的大小
【题目】给定一个整型矩阵matrix,其中的值只有0和1两种,求其中全是1的所有矩形区域,最大的矩形区域为1的数量。采用贪心算法。将问题分解成子问题。 子问题定义:现在可以求的以某一行作为矩形最后一行时 矩形的最大区域 原问题的解就是从0到m-1行获得的最大矩形的最大矩形,也就是m个子问题解的最优解。 问题变为求解第i行结尾的矩形的最大值是多少。 给定矩阵matrix: 第i行 以...原创 2018-05-01 16:43:15 · 988 阅读 · 0 评论 -
左神算法 设计可以变更的缓存结构
【题目】怎么实现一个LRU 分成三步 一、先自己实现一个双向链表Node。这里的V可以是任意的类。相当于把V类包装成双向链表结构的Node节点。public static class Node<V> { public V value; public Node<V> last; public Node<V> ...原创 2018-04-14 09:41:44 · 221 阅读 · 0 评论 -
左神算法 只用2GB内存在20亿个整数中找到出现次数最多的数
【题目】有一个包含20个全是32位整数的大文件,在其中找到出现次数最多的数。 如果用HashMap,key是int型,value也是int型 2*20 * 10^8 * 4B = 16GB内存 将20亿个整数用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被哈希到不同的小文件,假设哈希函数足够好,每个小文件的内存不会超过1GB。 然后统计每个小文件每种数出现的次数,得到16个...原创 2018-04-13 23:11:19 · 911 阅读 · 0 评论 -
反转链表 单向和双向链表 附代码
反转一个单链表public class Main { public static void main(String[] args) { Node head1 = new Node(0); Node node = head1; for (int i = 1; i < 6; i++) { node.next = ...原创 2018-03-29 16:32:52 · 243 阅读 · 0 评论 -
LeetCode 链表专题
1、sort-list 题目描述 Sort a linked list in O(n log n) time using constant space complexity. 【思路】考虑归并排序,学到的一个方法是,分出了左右两个部分后,把左部分的最后一个链表的节点的next指向null,这样就自然形成了两个链表 【注意】踩过的坑见代码注释public class Main { ...原创 2018-03-29 09:52:06 · 521 阅读 · 0 评论 -
层序遍历二叉树
【点评】用到广度优先搜索,队列存入二叉树的节点,先进先出。 用levelLastNode表示每一层的最后一个节点,lastNode表示当前遍历到的最后一个节点,也就是最新的存入队列的节点。 从队列头弹出节点,查看左右子树,有的话压入队列尾,lastNode一直跟随更新。然后判断当前队列是不是这层的最后一个节点,是的话,更新下一层的最后一个节点是LastNode。 binary-tree-le...原创 2018-03-26 22:36:57 · 160 阅读 · 0 评论 -
LeetCode 树专题(二)
13、construct-binary-tree-from-preorder-and-inorder-traversal 题目描述Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that duplicates do not exist in t...原创 2018-03-26 10:58:04 · 313 阅读 · 0 评论 -
链表Node,二叉树TreeNode, 广度优先搜索中压入队列的Node, 字典树中的Node
链表Node这么写class Node { int val; Node next; public Node(int val) { this.val = val; }}Node节点中有个成员变量val,是整型的,代表这个节点的值。next指针指向的是下一个节点。二叉树TreeNodeclass TreeNode { int...原创 2018-03-25 22:24:40 · 2034 阅读 · 0 评论 -
0-1背包问题 完全背包问题 附动态规划过程图和代码
【题目】 链接:https://www.nowcoder.com/questionTerminal/15bdb1bacb1843f381102ee609577385 来源:牛客网考虑一个有n=5个物品的背包问题实例,背包的容量m=10,v(价值)=(6,3,5,4,6),并且w(重量)=(2,2,6,5,4),请问不超过sw(背包能承受的总重)的情况下,最大的放入价值是多少() 【0-1...原创 2018-03-25 19:21:58 · 4390 阅读 · 0 评论 -
LeetCode maximum-subarray 最大子序和
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但...原创 2018-05-07 20:47:18 · 119 阅读 · 0 评论 -
LeetCode 贪心算法 jump-game-ii 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。在jump-game的基础上改动下...原创 2018-05-07 21:00:29 · 332 阅读 · 0 评论 -
LeetCode 79单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED...原创 2018-06-28 20:12:02 · 436 阅读 · 0 评论 -
LeetCode81 搜索旋转排序数组 II
二分查找,但是下面的代码在测试用例[3,1] 1中出错。package 牛客刷题.LeetCode.查找.search_in_rotated_sorted_array_ii;/** * Created by Administrator on 2018/6/28 0028. */public class Solution { public static void main(St...原创 2018-06-28 16:02:45 · 513 阅读 · 0 评论 -
拼多多2018校园招聘编程题题解
一、列表补全[编程题] 列表补全时间限制:1秒空间限制:32768K在商城的某个位置有一个商品列表,该列表是由L1、L2两个子列表拼接而成。当用户浏览并翻页时,需要从列表L1、L2中获取商品进行展示。展示规则如下:1. 用户可以进行多次翻页,用offset表示用户在之前页面已经浏览的商品数量,比如offset为4,表示用户已经看了4个商品2. n表示当前页面需要展示的商品数量...原创 2018-06-26 20:08:27 · 690 阅读 · 0 评论 -
爱奇艺2018秋季Java笔试第二场 第三道编程题 牛牛和羊羊 求数学期望
题目地址:https://www.nowcoder.com/questionTerminal/128d8d7d1898406b817fc69baa20602f链接:https://www.nowcoder.com/questionTerminal/128d8d7d1898406b817fc69baa20602f来源:牛客网牛牛和羊羊非常无聊.他们有n + m个共同朋友,他们中有n个是...原创 2018-06-24 09:54:31 · 1689 阅读 · 0 评论 -
判断图是否连通三种方法 dfs bfs 并查集(代码带更新)
数据结构 图 判断图是否连通 图的遍历方法有dfs,bfs先遍历一遍图,判断是否所有的节点都遍历到并查集的方法合并节点,最后数一共有多少集合,如果集合是1,证明连通。...原创 2018-05-22 22:07:18 · 3772 阅读 · 0 评论 -
LeetCode20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输...原创 2018-05-26 21:07:53 · 157 阅读 · 0 评论 -
LeetCode 32. 最长有效括号 栈解决和动态规划解决 附代码
【注意】如果栈为空的话,peek会报错,不会返回null。Stack&amp;amp;lt;Character&amp;amp;gt; stack = new Stack&amp;amp;lt;&amp;amp;gt;();Character c = stack.peek();报错Exception in thread &amp;quot;main&amp;quot; java.util.Emp原创 2018-05-26 16:48:39 · 1149 阅读 · 0 评论 -
LeetCode42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6先遍历一遍数组,引入数组left...原创 2018-05-26 14:52:12 · 1061 阅读 · 0 评论 -
LeetCode150. 逆波兰表达式求值
根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1:输入: [“2”, “1”, “+”, “3”, “*”] 输出: 9 解释: ((2 + 1) * 3) = 9 ...原创 2018-05-26 10:51:18 · 418 阅读 · 0 评论 -
LeetCode29 两数相除
相当于复杂度优化到logN. 如 100 3 普通方法是 3 + 3 + 3 + 3 … + 3累加到100,数加了多少次 优化方法 3 6 12 24… 1 2 4 8… 看能累加多少次,超过的方法减去求得剩下的值,继续进行累加。 注意边界条件package 牛客刷题.LeetCode.模拟.divide_two_integers;/**...原创 2018-05-26 01:33:56 · 2042 阅读 · 0 评论 -
LeetCode118. 杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]import java.util.ArrayList;import java.util.Arra...原创 2018-05-26 00:43:26 · 388 阅读 · 0 评论 -
LeetCode119 杨辉三角 II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3 输出: [1,3,3,1] 进阶:你可以优化你的算法到 O(k) 空间复杂度吗? 【点评】用改进版的动态规划,将二维dp改为两个dp数组,cur和last,cur是从上一行last演化而来,注意交替变化,res始终记录当前算得的最新值。如果...原创 2018-05-26 00:22:36 · 559 阅读 · 0 评论 -
模拟笔试 爱奇艺2018秋招Java开发
最后一道编程题 【平方根问题】 【题目】 链接:https://www.nowcoder.com/questionTerminal/6524263a0cc9427ebb0af10b3f366774 来源:牛客网 考虑定义在两正整数上的函数SSR(平方根之和的平方):SSR(A, B) = (sqrt(A) + sqrt(B))^2。牛牛对函数值为整数的情况很感兴趣。现在给定整数...原创 2018-03-25 11:22:11 · 1026 阅读 · 0 评论 -
左神算法 不重复打印排序数组中相加和为给定值的所有二元组
【题目】 给定一个排序的数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。如果从left = 0,right= 0开始,下一步的行动很难判断,如果right要保证大于left,肯定right先动,如果sum = arr[left] +arr[right] k呢,怎么移动,left向右移动吗,不合适。 所以让right在数组的末端,从left左边,right右边像中间扩。时原创 2018-02-05 14:52:55 · 267 阅读 · 0 评论 -
左神算法 在数组中找到出现次数大于N/K的数
左神的代码写的很好,时间复杂度是O(N*K),额外空间复杂度O(K),用map集合保存K个不同的值。一、如果map的大小不超过K,遍历到相同的,value加1,不同的,添加进去。用map.containskey判断是否在容器中,比用数组方便。 二、如果map大小达到K,遍历到相同的,所有键的值减1,如果值变成0,要删除。这时候引出一全体键值都减1的函数,左神用了遍历map,如果要删除的键放进一个原创 2018-02-05 10:49:33 · 512 阅读 · 0 评论 -
左神算法 在数组中找到出现次数大于1/2的数
一、参考剑指offer的思路 如果数组中出现大于1/2的数,如果按顺序排列,这个数肯定出现在下标为N/2的数上,所以这里参考Top-K问题,用快速排序原理求得第N/2大的值,然后判断该值的数量有没有大于数组长度的一半。如果确认大于1/2,证明就是该数,如果不是,证明没有这样的数。代码如下二、左神的思路 如果有个数出现次数大于1/2,此时遍历数组,删除两两不同的数,该数肯定出现在剩下的数中。原创 2018-02-04 22:47:45 · 973 阅读 · 0 评论 -
无序数组中找到最小的k个数 O(N)解法 快速排序原理方法和BFPRT方法
最简便的方法是循环K次,依次找出最小的,第2小的,第K小的值,时间复杂度O(N*K),这种方法使用于K比较小的时候,如个位数,如果N数据量很大,K也较大,不适用。因为K大于N时,时间复杂度变成O(N^2)。第二种是堆排序,建立一个大根堆,时间复杂度是O(NlogK),此方法博客中有写到,详见堆排序。一、用快速排序,随机取枢轴量可以做到平均时间复杂度O(N),但是值选的不好会退化到O(N^2...原创 2018-02-04 14:12:12 · 5206 阅读 · 1 评论 -
左神算法 最长公共子序列问题
一、公共子序列 如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子序列。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。 二公共子串 子序列的定义改成要求连续出现。 【题目】 给定两个字符串str1和str2,返回两个字符串的最长公共子序列。 【举例】 str1=”利用动态规划 我把str2作行,str1作列 创建二原创 2018-01-28 22:39:19 · 528 阅读 · 0 评论 -
详解归并排序 附代码 时间复杂度推导
归并排序有个merge()方法,是将两个排好序的数组合并成一个有序数组。时间复杂度能稳定在O(NlogN),时间复杂度证明如下图所示。不想快速排序,如果碰到有序的数组,快速排序会退化到O(N^2) 归并排序空间复杂度O(NlogN),证明如下 public class Solution { public static Integer[] tmp; public stati原创 2018-02-03 21:19:04 · 5633 阅读 · 2 评论 -
详解堆排序 附代码 无序数组中找到最小的k个数
堆排序: 堆排序时间复杂度是O(NlogN) 空间复杂度如果不用递归的话可以达到O(1),在数组上原地排序 这里给出堆排序代码 注意此处在筛操作的时候sift(Object[] a, int n, int i),中间的参数n是代表这时候数组的总大小。因为在建完堆后,数组从后往前会一轮一轮的有序,n会渐渐减小。在无序数组中找最小的k个数的代码中就不需要记录这个值,在这代码中,需要建大根堆,用原创 2018-02-03 20:46:03 · 624 阅读 · 0 评论 -
深搜 广搜 代码
参考书中的图6-7 G7遍历,选取点1作为起始,用的邻接矩阵。深搜实现了递归和非递归版本,非递归版本用了栈,注意压入的节点不能立马出栈。后面还要用到,只有在该节点走投无路后才出栈,递归版本比较简单易懂。 广度优先用的queue队列。 public class GraphTraversal { public static void bfsMethod(int[][] adjMat原创 2018-01-09 19:45:17 · 746 阅读 · 0 评论 -
深度优先搜索 广度优先搜索 附代码
深度优先搜索有递归和非递归形式。非递归用栈实现。广度优先用队列实现。 图用的参考书上的图7。深搜非递归注意压入节点的时候先别出栈,当压入节点后无路可走后才压出栈。 注意深搜和广搜的搜索顺序,用点1节点做起始点和代码中给出的结果一致。 邻接矩阵和邻接表 public class GraphTraversal { public static void bfsMethod(int[][原创 2018-01-09 20:15:47 · 437 阅读 · 0 评论 -
静态内部类 单例设计模式举例
单例设计模式可以用静态内部类实现,下面解释它的优点和原因。懒加载 创建方式是用内部静态类中的一个静态方法返回实例对象。在不使用的时候这个单例是不会存在的。这个就和懒汉式是一样的。线程安全 如果有多个线程同时创建实例,根据类加载的机制,多线程初始化一个类,JVM能保证只有一个线程执行初始化方法,其他线程进入阻塞状态。但是它能被反射来重复构造对象。从静态内部类能复习类初始化时的顺序,先父类静原创 2018-01-17 19:14:24 · 271 阅读 · 0 评论