![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 54
Vanilla_Chi
这个作者很懒,什么都没留下…
展开
-
有序链表合并
将两个有序链表合并https://leetcode.com/problems/merge-two-sorted-lists/ Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the原创 2015-03-27 11:00:47 · 539 阅读 · 0 评论 -
树与二叉树
二叉树的基本性质相关普通二叉树创建: 先序二叉树,中序二叉树,后序二叉树。 给定两种遍历序列(前序中序或后序中序),重塑二叉树 遍历: 判断一个节点是否存在于二叉树中 二叉树的遍历(先序,中序,后序)递归/非递归 层次遍历(从上到下或从下到上打印) ZigZag遍历方式层次遍历 二叉树性质: 二叉树中叶子节点的个数 二叉树第K层节点数目 二叉树高度、最小高度 树的判断 判原创 2015-03-23 10:54:27 · 587 阅读 · 0 评论 -
基础模拟栈
栈的压入弹出序列来源:剑指offer22 给定两个整数序列,第一个为栈的压入序列,判断第二个序列是否为栈的弹出序列。 思路:同时遍历两个序列,当第二个序列中的元素不等于第一个序列中元素时,判断栈顶元素是否等于当前元素,如是则弹出,第二个游标后移。若不是,将第一个序列当前元素入栈后,游标后移,循环判断。 eg: 123456 与 132465,压弹栈的顺序为 1,入栈,出栈 2,入栈 3,原创 2015-06-02 11:08:17 · 423 阅读 · 0 评论 -
单调栈相关
1. 利用单调栈求最大矩形面积(两边求)来源 poj: http://poj.org/problem?id=2082 ; leetcode: https://leetcode.com/problems/largest-rectangle-in-histogram/ 题目:Given n non-negative integers representing the histogram's ba原创 2015-06-04 08:52:30 · 458 阅读 · 0 评论 -
按条件重组数组
快速排序变种: 一、将数组按条件重组成两半重点:分割数组 + 扩展条件封装 数组分割:两种方式 1. 两个游标一个从前向后,一个从后向前 2. 两个游标都是从前向后。 时间复杂度:两种时间复杂度都是O(n)条件封装–条件包括: 1. 按奇数偶数分割 2. 按正数负数分割 3. 按整除3不整除3分割 4. ……eg. 剑指offer14—调整数组顺序使奇数位于偶数前面private s原创 2015-03-19 10:20:12 · 1967 阅读 · 0 评论 -
排序算法简述
一 、排序算法按时间复杂度分类平方阶:选择排序,插入排序,冒泡排序对数阶:归并排序,快速排序,堆排序O(n^(1+t))阶,t介于0~1之间:希尔排序线性阶:桶排序二、排序算法按是否稳定分类 (稳定是指,相同的元素排序后是否能保持排序前的前后顺序)稳定的排序:插入排序,冒泡排序,归并排序,桶排序不稳定的排序:选择排序,快速排序,堆排序,希尔排序注:可以理解为,如果需要长距原创 2015-03-17 19:31:50 · 599 阅读 · 0 评论 -
其他栈相关问题
1. 包含min函数的栈来源 leetcode155 https://leetcode.com/problems/min-stack/ 剑指offer21Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.push(x) -- Push element原创 2015-06-05 19:28:49 · 409 阅读 · 0 评论 -
栈与队列
1. 基础模拟栈,包括:栈的压入弹出序列 后缀表达式求解 括号匹配问题 数制转化问题2. 单调栈问题3. 汉诺塔问题及其扩展4. 队列(循环队列实现)5. 其他相关问题包含min函数的栈 用栈实现队列 用队列实现栈 用一个数组实现两个栈 翻转栈中所有元素,要求空间复杂度o(1)原创 2015-06-01 09:28:33 · 424 阅读 · 0 评论 -
对数阶排序算法
定义交换函数:public void swap(int[] arr, int i, int j){ if(i == j) return; arr[i] = arr[i]^arr[j]; arr[j] = arr[i]^arr[j]; arr[i] = arr[i]^arr[j];}归并排序 分析:递归分治,不断分割排序合并 用空间换时间 空间复杂度:O(n)原创 2015-03-18 09:53:49 · 2048 阅读 · 3 评论 -
数组中异常数发现
数组中1个数出现一次其他出现2次Leetcode136 https://leetcode.com/problems/single-number/ 思路:有一个异常数:整体抑或一遍。适合只有1个数出现奇数次,其他数出现偶数次public int singleNumber(int[] nums) { for(int i = 1; i < nums.length; i++) nums[0] ^=原创 2015-06-09 19:51:50 · 639 阅读 · 0 评论 -
位运算其他应用
位操作进行标识leetcode78 https://leetcode.com/problems/subsets/Given a set of distinct integers, nums, return all possible subsets.Note:Elements in a subset must be in non-descending order.The solution set原创 2015-06-09 19:53:54 · 470 阅读 · 0 评论 -
位运算
1. 基本位运算进制转换 加法运算 简单位运算2. 某个数字进行位运算将数字按位倒序 判断数字位中有多少个13. 数组中异常数发现数组中1个数出现一次其他出现2次 数组中2个数出现一次其他出现2次 数组中1个数出现一次其他出现3次 数组中1个数出现了n/2多次4. 位运算其他应用位操作进行标识 位操作进行哈希设计原创 2015-06-06 10:01:44 · 457 阅读 · 0 评论 -
某个数字进行位运算
将数字按位倒序leetcode190 https://leetcode.com/problems/reverse-bits/Reverse bits of a given 32 bits unsigned integer.For example, given input 43261596 (represented in binary as 00000010100101000001111010011原创 2015-06-09 19:46:26 · 624 阅读 · 0 评论 -
二叉查找树相关判断
判断给定树是否为二叉查找树来源leetcode98 https://leetcode.com/problems/validate-binary-search-tree/ 思路:刚开始想的是,当前树左子小于当前节点并且右子大于当前节点并且其两个子树也递归满足这样条件时成立。 代码如下public boolean ifBinarySearchTree(TreeNode root){ if原创 2015-05-25 19:39:10 · 434 阅读 · 0 评论 -
二叉查找树构建
给定n构建最大值为n的二叉查找树——树的形态种类 https://leetcode.com/problems/unique-binary-search-trees/ Given n, how many structurally unique BST’s (binary search trees) that store values 1…n? For example, Given n = 3,原创 2015-05-25 19:24:05 · 1123 阅读 · 0 评论 -
链表重组篇
主要涉及链表的重组,通常是按规定的对链表逆序,旋转等操作,常用到递归思想,所以要明确递归的输入输出是什么 注意:当给出链表是空,或者一个节点时程序不要崩溃。将链表逆向反转、逆向输出链表(递归、非递归)1.从尾向头打印链表——剑指offer5 方法: 可以顺序遍历链表,将值存栈中,最后再输出;也可以直接递归输出。 注:其实实质一定会用到递归,因为要从后向前输出值,因此,最开始访问的值一定要用什么原创 2015-03-27 08:49:40 · 945 阅读 · 0 评论 -
二叉树其他操作
二叉树的镜像剑指offer19 1 1 / \ / \ 2 3 --> 3 2 / \ 4 4public TreeNode getIso(TreeNode root){ if(root == null) return null; TreeNode nRoo原创 2015-05-21 16:53:20 · 430 阅读 · 0 评论 -
PathSum问题
树的节点结构: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }1.Root-to-Leaf Path(1)判断是否有一条从根到叶子的路径,使得路径和等于某个值 https://leetcode.com/problems/p原创 2015-05-21 10:22:53 · 535 阅读 · 0 评论 -
构建二叉树
以#为终止符构建先序二叉树eg. 12#4#5##3##public int index = 0;public TreeNode constructPreorderTree(char[] str){ if(str[index++] == '#') return null; TreeNode node = new TreeNode(str[index]-'0'); index原创 2015-05-28 09:34:50 · 477 阅读 · 0 评论 -
二叉树转换成其他结构
将二叉树变为链表https://leetcode.com/problems/flatten-binary-tree-to-linked-list/Given 1 / \ 2 5 / \ \ 3 4 6The flattened tree should look like: 1 \ 2原创 2015-05-21 11:00:45 · 442 阅读 · 0 评论 -
链表性质判断
判断单链表是否有环,如果有环的话请返回从头结点进入环的第一个节点,没有就返回null https://leetcode.com/problems/linked-list-cycle-ii/ 两个游标指针一起从头走,一个走一步,一个走两步,若能再次相遇,就说明有环. 两个指针分别从头和相遇处走,再次相遇处就是相交点。public ListNode detectCycle(ListNode hea原创 2015-03-30 11:09:36 · 441 阅读 · 0 评论 -
特殊列表拷贝
拷贝带有random域的特殊链表Copy List with Random Pointer https://leetcode.com/problems/copy-list-with-random-pointer/ A linked list is given such that each node contains an additional random pointer which could原创 2015-03-30 11:07:07 · 404 阅读 · 0 评论 -
链表排序相关
将链表按给定标准值(pivot)分割Partition List https://leetcode.com/problems/partition-list/ Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal t原创 2015-03-30 09:39:11 · 508 阅读 · 0 评论 -
链表性质判断
判断单链表是否有环,如果有环的话请返回从头结点进入环的第一个节点,没有就返回null https://leetcode.com/problems/linked-list-cycle-ii/ 两个游标指针一起从头走,一个走一步,一个走两步,若能再次相遇,就说明有环. 两个指针分别从头和相遇处走,再次相遇处就是相交点。public ListNode detectCycle(ListNode hea原创 2015-03-30 11:12:01 · 573 阅读 · 0 评论 -
链表的特殊查找
定义链表节点public class ListNode { public int val; public ListNode next; public ListNode(int x){ val = x; next = null; }}找出单链表中间位置节点p与q指针同步,q若走不了两步了,p也不要走,因此只判断q是否能走两步即可。p原创 2015-03-22 10:39:12 · 720 阅读 · 0 评论 -
O(1)时间的插入与删除
**只给定单链表中某个结点p,O(1)时间内在p前面插入一个结点。返回头结点。** **要询问节点是否一定在链表中(否则判断的时间复杂度为O(n)),是否为空等这些条件。 采用交换值的方法,相当于在该节点后插入节点。public static ListNode insertNodeBeforeNode(ListNode head, ListNode node, ListNode newNode)原创 2015-03-23 09:13:22 · 1390 阅读 · 0 评论 -
有序链表删除重复元素
从有序链表中删除重复元素,每种剩下一个。1->1->2->2->3->4->4;===>1->2->3->4 两个游标p,q走。p为标杆值,若q的值等于p时,p继续走,不等于时,就将p的下一个置为q。public ListNode deleteDuplicates(ListNode head){ if(head != null){ ListNode p = head, q原创 2015-03-23 10:14:16 · 959 阅读 · 0 评论 -
希尔排序实现
定义交换函数:private static void swap(int[] arr, int i, int j) { if(i == j) return; arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j];}希尔排序: 插入排序变原创 2015-03-18 14:53:13 · 456 阅读 · 0 评论 -
链表实现两个数字相加
两个用链表表示的数字相加 https://leetcode.com/problems/add-two-numbers/ You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contai原创 2015-04-03 09:32:36 · 1441 阅读 · 0 评论 -
链表相关简介
链表相关题目: 注:链表操作的难度在于如何考虑全面,思维逻辑一定要清晰,不要出现空指针异常单链表的基本操作建立插入删除特殊查找找出单链表中间位置节点找到或者删除链表中倒数第k个结点未给头结点的插入和删除只给定单链表中某个结点p(非空结点),在p前面插入一个结点。只给定单链表中某个结点p(并非最后一个结点)指针,删除该结点。删除重复数据从有序链表中删除重复数据,每种数据留下一个。从有序链原创 2015-03-18 11:07:26 · 509 阅读 · 0 评论 -
树与二叉树基本性质相关
树的基本性质相关树的结点包含一个数据及指向子树的分支。结点拥有的子树数称为结点的度。度为0的结点称为叶结点。树的度是树的各节点度的最大值。结点的层次从根开始定义,根为第一层,根的孩子为第二层…..树中结点的最大层次称为树的深度或者高度。二叉树的基本性质相关二叉树每个结点最多有两棵子树,不存在度大于2的结点。左右子树是有序的。二叉树的形态:空二叉树,只有根结点,根结点只有左子树,根结点只有右原创 2015-04-09 20:03:04 · 515 阅读 · 0 评论 -
获取二叉树性质相关
树的结构为public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; }}二叉树中叶子节点的个数叶子指没有两个孩子的节点。递归的方法是,一个节点下的叶子原创 2015-04-09 20:39:56 · 522 阅读 · 0 评论 -
树的判断
树的结构为public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; }}判断两个树结构是否相同https://leetcode.com/problem原创 2015-04-17 16:22:35 · 605 阅读 · 0 评论 -
二叉树遍历相关
树的结构为public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; }}判断一个结点是否存在于二叉树中递归判断即可public boolean ifE原创 2015-04-17 10:22:55 · 567 阅读 · 1 评论 -
简单平方阶排序总结
程序语言:Java 定义交换函数:public void swap(int[] arr, int i, int j){ if(i == j) return; arr[i] = arr[i]^arr[j]; arr[j] = arr[i]^arr[j]; arr[i] = arr[i]^arr[j];}选择排序 分析:每次从未排好序部分遍历一遍保留最小值的脚标,与原创 2015-03-17 19:42:36 · 894 阅读 · 0 评论 -
二叉查找树其他操作
将二叉搜索树转变为排序的双向链表来源:剑指offer27 思路:想成是中序遍历的变形,可以利用中序遍历的非递归方式不断压栈弹栈,保存前一个节点与其互指。 也可以使用递归方式,每次可以返回已成形链表的最后一个节点,用给节点连接当前节点,再将当前节点的右子树的最小节点连接起来。public TreeNode last = null;public TreeNode Convert(TreeNode原创 2015-05-27 20:23:19 · 407 阅读 · 0 评论 -
位基本运算
1. 进制转换思路: 数制转化问题可以利用乘法除法进行运算并用栈或者其他数据结构进行存储,但是更高效的是能用就用位运算来做。例如将十进制转为16、8、2进制,都可以运用位运算来做,这里贴出java.lang.Integer中进制转化代码供借鉴和学习~private static String toUnsignedString(int i, int shift){//i为待转换的整数,shift为要原创 2015-06-07 10:56:48 · 539 阅读 · 0 评论