自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 动态规划解题思路

1,自顶向下分析,构建解题思路树,发现重复求解的元素使用记忆式搜索,然后尝试自底向上解法进一步降低复杂度(斐波那契数组类型题目)

2019-03-03 18:49:52 314

原创 链表题主要思路

1.穿针引线(one-pass)2.拆分链表(构造几个新的链表再拼接)3.涉及头节点的边界情况,构造虚拟节点

2019-02-28 16:33:59 163

原创 并查集

并查集可以很好的解决连接问题和数学中集合类的实现

2019-02-07 22:56:53 141

原创 平衡二叉树-红黑树

如果数组按照有序顺序插入二叉树,那么二叉树就会退化为链表,同时因为要进行左右子树的判断,速度会比链表还慢。由于数据是动态的插入,因此我们不能在最开始获得全部数据,所以就不能用打乱数据的方式来解决这个问题,由此衍生出了红黑树,他能保证插入删除查找的概率稳定在O(logN)。...

2019-02-06 19:53:01 380

原创 二分搜索树

二分搜索树主要用于表查询(字典查询)查找插入删除普通数组O(N)O(N)O(N)顺序数组O(logN)O(N)O(N)二分搜索树O(logN)O(logN)O(logN)可以高效的动态维护数据。...

2019-02-03 23:28:09 120

原创 堆的应用

1.在N个数中找到前M个数时间复杂度O(NlogM)。2.多路归并排序每次将数组分为d路,在这d个数中使用堆排序推出最小的那个,在d等于数组长度的时候退化为堆排序。3.d叉堆结构可以降低树的高度,但同时增加了比较次数。...

2019-02-02 17:50:37 121

原创 索引堆

与普通堆相比,节点存储的是数据的索引,维护时比较数据,但交换索引。适用于数据非常复杂,交换起来比较耗时,或者我们堆中的数据和索引有固定关系的情况,在构建为堆之后会破坏这些关系,在希望修改数据时会比较麻烦,因此可以使用索引堆。为了完成修改操作,但不需要遍历索引数组的需求,引入反向索引。reverse[i]表示索引i在index数组中的位置(经典思想)index[i] = j;reverse...

2019-02-02 17:40:03 154

原创 排序方法比较

TYPE平均时间复杂度原地排序稳定性插入排序O(N^2)可以O(1)稳定归并排序O(NlogN)不可以 O(N)稳定快速排序O(NlogN)可以O(logN)递归占用堆的空间不稳定堆排序O(NlogN)可以O(1)不稳定...

2019-02-02 16:25:52 281

原创 堆排序

为什么要使用堆排序?在N个元素中选出前M个元素,若使用普通排序算法,时间复杂度最快是O(NlogN),使用堆排序可以把时间复杂度降低到O(NlogM)。对一个元素的操作:普通数组:入队:O(1),出队:O(N)排序数组:入队:O(N),出队:O(1)堆:入队:O(logN),出队:O(logN)堆中某个节点的值总不大于其父节点的值,堆是一棵完全二叉树(并不是层越高数值越大)底层使用数...

2019-02-02 00:03:17 130

原创 微博用户登录

任老师说:包的种类和作用1.dao:每一个数据库中的表需要建立一个dao包中的类进行CRUD,并把执行结果返回给servlet(操作数据库 UserDao)2.domain:映射每一个数据库中的表(User)3.servlet:处理JSP中用户的请求(中转站 LoginServlet)...

2019-01-29 22:52:49 1158

原创 排序算法

选择排序在剩余的数组中选择最小的插入到相应位置时间复杂度:O(N^2)public static void sort(int[] a,int low,int high){ for(int i = 0;i<=high;i++){ int minIndex = i; for(int j = i+1;j<=high;j++){ if(a[j]<a[mi...

2019-01-29 20:41:58 140

原创 去除一个数字二进制中最低位的1的方法

利用位运算n&(n-1)n : 10110100n-1 : 10110011n&(n-1) : 10110000剑指Offer应用题目:求二进制中1的个数输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示public class Solution {    public int NumberOf1(int n) {...

2018-12-21 10:40:57 1606

原创 用DFS(广度优先遍历)解决组合问题

从元素集中选取几个元素构成子集,求解可以构成子集的数目,与排列的主要区别是子集中元素顺序不同视为同一个子集解题思路:解题时要注意进行剪枝处理,与排列问题解法的区别是对每次迭代要重新设置起始值,避免出现添加了之前的元素造成顺序不同的同一个子集被添加到答案中的情况。如果没有重复元素,不需要用数组对访问过的元素进行标记,因为剪枝过程可以避免访问到之前的添加过的元素。如果有重复元素,需要对原始数...

2018-12-18 15:26:13 586

原创 用DFS(广度优先遍历)解决排列问题

例如有 { ‘a’,‘b’,‘c’ } 三个字符,求解所有由这三个字符排列得到的字符串。解题思路:一次排列中已经遍历过的元素不能重复遍历,因此需要对添加过的元素进行标记,避免本次排列出现重复。这种问题在一次排列求解完成之后还需要继续求解,在本次排列结束后,为了保证已经访问过但是不在当前递归链中的元素可以继续被访问,需要对这个元素取消标记,同时移出子集。LeetCode经典应用题目:4...

2018-12-18 15:11:24 447

原创 用DFS(深度优先遍历)解决可达性/连通性问题

解题思路:从一个节点出发,使用 DFS 对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,每趟从初始节点开始,需要把可以到达的位置做标记,并且标记后不需要更改,当走不通时返回,再寻找下一个节点进行遍历。LeetCode上典型题目应用:695 查找最大的连通面积200 矩阵中的连通分量数目695 查找最大的连通面积[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0...

2018-12-18 14:51:50 1520

原创 DFS(深度优先遍历)解题思路

DFS主要可以用于解决三种问题1.可达性/连通性问题LeetCode上适用题目:695 查找最大的连通面积200 矩阵中的连通分量数目547 好友关系的连通分量数目130 填充封闭区域417 能到达的太平洋和大西洋的区域2.排列问题LeetCode上适用题目:17 数字键盘组合93 IP 地址划分79 在矩阵中寻找字符串257 输出二叉树中所有从根到叶子的路径47 含有...

2018-12-18 14:38:50 1634

原创 广度优先遍历(BFS)的解题思路

1 用队列保存与当前节点直接相连的节点2 用数组记录每个节点是否遍历过,防止重复遍历LeetCode中应用题目:279 组成整数的最小平方数数量127 最短单词路径基本应用场景:计算在网格中从起点到终点的最短路径长度[[1,1,0,1],[1,0,1,0],[1,1,1,1],[1,0,1,1]]1 表示可以经过某个位置,求解从 (0, 0) 位置到 (tr, tc) 位置的最...

2018-12-14 11:48:10 671

转载 广度优先遍历总结(BFS)

BFS广度优先搜索一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。第一层:0 -> {6,2,1,5}第二层:6 -> {4}2 -> {}1 -> {}5 -> {3}第三层:4 -> {}3 -> {}每一层遍历的节点都与根节点距离相同。设 d...

2018-12-13 21:04:44 822

原创 桶排序

先用HashMap统计每个元素出现的频率,然后设置若干个桶,桶的下标代表每个元素出现的频率,把出现频率相同的元素添加到同一个桶中,下标为i代表桶中元素出现i次,再根据题目要求进行统计。LeetCode对应题目:347. Top K Frequent Elements (Medium)348. Sort Characters By Frequency (Medium)347 Top K F...

2018-12-11 10:12:17 230

原创 排序方法及寻找第K个最大元素方法总结

LeetCode对应题目:215. Kth Largest Element in an Array (Medium)题目描述:找到第 k 大的元素。解题思路1:sort排序方法时间复杂度 O(NlogN),空间复杂度 O(1)public int findKthLargest(int[] nums, int k) { Arrays.sort(nums); return n...

2018-12-10 14:38:07 848

原创 求一个数字的掩码的方法总结

对于 00000101,它的掩码为 00000111。1 使用Integer.highestOneBit(int num)方法,如101调用这个方法得到4(100),然后左移一位减1得到掩码(速度最慢)int mask = (Integer.highestOneBit(num)<<1)-1;2 把值为1的mask左移30位,使1放在最高位剩下位为0,然后和num做&运算...

2018-12-07 14:27:10 1876

原创 不用额外变量交换两个整数

a = a ^ b; //a代表两个数不同的位b = a ^ b; //b代表把之前的b与a不同的位数反转过来,即之前的aa = a ^ b; //a代表把b(之前的a)与之前的b不同的位反转过来,得到之前的b...

2018-12-07 11:53:36 225

原创 用位运算统计一个数的二进制有几个1(统计两个数二进制有几位不同)

LeetCode应用题目:461 统计两个数的二进制表示有多少位不同输入: x = 1, y = 4输出: 21 (0 0 0 1)4 (0 1 0 0)↑ ↑解题思路:把x和y异或,1的个数代表两个数不同的位数统计一个二进制数字的1的位数有:1 转换为二进制字符串统计1的个数(速度最慢)public int hammingDistance(int x, int y...

2018-12-07 10:05:13 791

原创 图的应用之拓扑排序

拓扑排序常用于在具有先序关系的任务规划中,解决此类问题需要先把图勾画出来。LeetCode适用题目:207 课程安排的合法性要求:一个课程可能会先修课程,判断给定的先修课程规定是否合法。210 课程安排的顺序要求:输出修完所有课程的顺序例如:输入:[[1,0],[2,0],[3,1],[3,2]](每个数组的第二个元素为先修课程)输出:先修课程合法,顺序为[0,1,2,3]或者[0...

2018-12-06 16:53:16 280

原创 二分查找(折半查找)总结

二分查找分为通过数组的角标进行查找和通过元素数值进行查找通过数组的角标进行查找:通常用于数组数值有序的情况正常实现:public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l <= h) { int m = l + (h - l) / ...

2018-12-05 09:05:27 1058

原创 数组元素在[1,n]之间的替换重复缺失问题

题目描述:一个数组元素在 [1, n] 之间,其中一些数被替换为另一些数,导致重复和丢失,找出重复的数和丢失的数。leetcode上可解题目:645 一个元素被替换,寻找丢失和重复元素448 寻找所有丢失的元素442 寻找所有重复的元素要求:时间复杂度小于O(N^2)输入:nums = {4,2,1,2};输出:重复的数:2丢失的数:3解题思路1:使用HashSet,判断重复元素...

2018-12-04 20:39:34 466

原创 树的前序,后序,中序和层序遍历对比及java代码实现

1 / \ 2 3 / \ \4 5 6层序:[1 2 3 4 5 6]前序:[1 2 4 5 3 6]中序:[4 2 5 1 3 6]后序:[4 5 2 6 3 1]前,中,后序遍历是DFS,可以使用递归的方法,代码除了顺序其他相同:前序void dfs(TreeNode root) { visit(root); dfs(r...

2018-11-26 10:54:12 360

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除