数据结构与算法2018
数据结构与算法知识
Wang.T
Everything is nothing
展开
-
移除链表元素
删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5题目分析:想到给定的值在链表中可能存在3个地方,两端和中间,所以分三种情况处理。代码实现:public static class ListNode{ int val;...原创 2018-11-17 21:39:24 · 195 阅读 · 0 评论 -
回文链表
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?题目分析:很容易想到将链表折半分开,反转后半部分,对应比较值。代码实现:public static class ListNode { int ...原创 2018-11-17 21:30:37 · 253 阅读 · 0 评论 -
反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?题目分析:将一个单链表反转,令前一个节点是后一个节点的next即可代码实现:public static class ListNode { ...原创 2018-11-17 21:21:15 · 222 阅读 · 0 评论 -
合并两个有序的链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4题目分析:要将两个有序的链表连接起来,可以设置两个指针分别指向两个链表的头节点,从头节点开始比较值,把值小的节点加在另一个节点后面,比较完后,两个指针后移再比...原创 2018-11-17 21:08:44 · 498 阅读 · 0 评论 -
删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 – head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 -> 9示例 1:输入: head = [4,5,1,9], node = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变...原创 2018-11-17 20:53:59 · 2089 阅读 · 0 评论 -
搜索二维数组
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例 1:输入:matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50]]target = 3输出: true示例 2:输入:m...原创 2018-11-13 19:07:52 · 596 阅读 · 0 评论 -
数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n(n为数组长度), 其中有些元素出现两次,而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]题目分析:使用额外数组处理:使用新的数组存放数据定义的新数组存储元素的方式为:其下标是数组a中的元素,这样,只要元...原创 2018-11-23 21:39:34 · 1099 阅读 · 0 评论 -
按奇偶排序数组
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例:输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。提示:1 <= A.length <= 50000 <= A[i] <= 5000...原创 2018-11-23 21:23:09 · 1157 阅读 · 0 评论 -
数组元素平方处理
给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。举例:nums = {-1,1,1,1} 你应该返回1,因为这个数组所有数的平方取值都是1,只有一种取值nums = {-1,0,1,2,3} 你应该返回4,因为nums数组所有元素的平方值一共4种取值:1,0,4,9题目分析:求平方值,那...原创 2018-11-23 21:02:48 · 5525 阅读 · 0 评论 -
删除链表中的倒数第n个节点
给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?题目分析:一、设快慢指针slow和fast,让fast先走n-1步,然后再同时后移...原创 2018-11-18 11:08:42 · 2121 阅读 · 0 评论 -
环形链表II——寻找环形链表的入口
给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回 null。说明:不允许修改给定的链表。进阶:你是否可以不用额外空间解决此题?题目分析:一、使用额外的空间处理即使用HashMap,遍历链表并将节点存储在HashMap中,如果出现重复的节点,则就是环形链表的入环节点,返回。代码实现:public static class ListNode{ int va...原创 2018-11-18 10:52:13 · 1043 阅读 · 1 评论 -
环形链表
给定一个链表,判断链表中是否有环。进阶:你能否不使用额外空间解决此题?题目分析:链表中有环是指:1->2->3无环,1->2->3->4->3有环查资料,得知此题用快慢指针解决,即设定两个指针,快指针一次后移2位,慢指针一次后移1位,如若有环,快指针一定会追上慢指针。代码实现:public static class ListNode{ i...原创 2018-11-17 21:50:11 · 230 阅读 · 0 评论 -
寻找旋转排序数组中的最小值II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例 1:输入: [1,3,5]输出: 1示例 2:输入: [2,2,2,0,1]输出: 0代码实现一:public int findMin(int[] nums){ ...原创 2018-11-16 15:00:37 · 230 阅读 · 0 评论 -
寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0题目分析:数组是升序排列的,且其中没有重复元素,只是有可能会在某...原创 2018-11-06 20:56:35 · 740 阅读 · 0 评论 -
搜索旋转排序数组 II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。示例 1:输入: nums = [2,5,6,0,0,1,2], target = 0输出: true示例 2:输入: nums = [2,5,...原创 2018-11-06 20:41:45 · 233 阅读 · 0 评论 -
搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], targ...原创 2018-11-06 20:07:02 · 5277 阅读 · 0 评论 -
相交链表
编写一个程序,找到两个单链表相交的起始节点。例如,下面的两个链表:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3在节点 c1 开始相交。注意:如果两个链表没有交点,返回 null...原创 2018-11-06 09:23:56 · 162 阅读 · 0 评论 -
两个数组的交集II
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。题目分析:与两个...原创 2018-11-03 23:58:18 · 204 阅读 · 0 评论 -
两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。题目分析:根据题目的意思,需要求出两个数组中的相同元...原创 2018-11-03 23:46:21 · 349 阅读 · 0 评论 -
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。题目分析:根据题目的意思,字母异位词是指由相同的字母按照不同的顺序组成的单词,根据此含义...原创 2018-11-03 23:37:22 · 7477 阅读 · 0 评论 -
括号的分数
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。示例 1:输入: "()"输出: 1示例 2:输入: "(())"输出: 2示例 3:输入: "()()"输出: 2示例 4:输入: "(()(()))"输出: 6...原创 2018-11-03 14:50:45 · 1278 阅读 · 0 评论 -
C++ STL模版库<stack>
(1)为了运用stack,你必须包含头文件:#include (2)在头文件中stack定义如下: namespace std{ template class T, class Container = deque > class stack; } 第一个template参数代表元素型别,带有默认值的第二个参数用来定原创 2017-12-08 22:31:37 · 229 阅读 · 0 评论 -
标准模板库STL学习总结
标准模板库就是类与函数模板的大集合。STL共有6种组件:容器,容器适配器,迭代器,算法,函数对象和函数适配器。1、容器:容器是用来存储和组织其他对象的对象。STL容器类的模板在标准头文件中定义。主要如下所示①序列容器基本的序列容器是上面图中的前三类:关于三者的优缺点主要是:A:vector矢量容器:可以随机访问容器的内容,在序列末转载 2017-12-08 22:04:18 · 209 阅读 · 0 评论 -
中缀表达式转后缀表达式并求值
逆波兰式这是我们一个编译原理实验课的实验题,根据给出的中缀表达式,将它转换为后缀表达式,再根据后缀表达式求值。刚开始,根据我之前刷的LeetCode题逆波兰式求值写的博客,我直接修改了上面的代码,添加中缀表达式转后缀表达式的操作,即得出了初始版本;初始版本代码:import java.util.Stack;public class RPN{ //中缀表达式转化为后缀表达式 ...原创 2018-10-17 23:49:53 · 3226 阅读 · 2 评论 -
词法分析
编译原理实验:实现词法分析除了实现了关键字、标识符、运算符、操作符,整数的识别,还实现了其中存在的双目运算符、小数、多位数、负数等特殊情况的识别类型处理类:Type.java/*** 定义各种类别的具体值以及对于输入字符进行判断是何种类型**/public class Type{ //关键字表 public static final String[] keyword ...原创 2018-10-18 09:33:46 · 1040 阅读 · 0 评论 -
数据结构——二叉树
二叉树前序,中序,后序,按层遍历:#include #include #include#includeusing namespace std;#define N 100char *a="ABC##D#E##F##"; //扩充二叉树t的前序序列typedef s原创 2017-11-08 21:10:02 · 593 阅读 · 0 评论 -
二叉树遍历的非递归算法
三种次序的寻访路线,它是从根结点开始沿左子树深入直到最左下端时,返回进入刚刚遇到结点的右子树;在右子树中,也是先深入到它的最左下结点时返回刚遇到结点的右子树······如此深入和返回,直到从根结点的右子树返回根结点止。在这一过程中,返回结点的顺序恰与深入结点的顺序相反,先深入的后返回,正好符合栈的特点。所以可以用栈来保存遍历过程中的结点信息来实现遍历二叉树的非递归算法,并且假定栈空间足够大不会发生转载 2017-11-12 15:44:51 · 1230 阅读 · 0 评论 -
树的遍历
利用树的扩展先根遍历序列创建度一定的树,然后实现树的先根次序遍历、后根次序遍历,层序遍历。在对树做任何运算之前,树本身必须存在,因此,首先必须创建树,实际上就是建立树的存储结构。例树的扩展前序序列为"AB###C###D###",度为3,则由此建立的树的先根次序序列为:ABCD,后序序列为:BCDA,层序序列是:ABCD此程序按层序遍历的时候使用了库具体代码:#incl原创 2017-11-20 22:44:22 · 387 阅读 · 0 评论 -
图的邻接表存储结构及求各顶点的度
数组与链表相结合的存储方法称为邻接表(Adjacency List)邻接表的处理方法是:1.图中顶点用一个一维数组存储,2.图中/*********************************************//* 邻接表存储结构 *//*******************************************原创 2017-11-22 21:16:33 · 32447 阅读 · 4 评论 -
顺序查找,折半查找(递归与非递归)
说明:编译器:Xcode语言:Cdata2.txt为:#include #include #define N 10000//从文件中读入数据存入数组int readData(int a[],int n,char *f ) //函数返回成功读入的数据个数{ FILE *fp;原创 2017-12-13 20:06:17 · 2096 阅读 · 0 评论 -
八种排序方法(三)——插入排序
编译器:Xcode 编程语言:C++源程序:#include <iostream>using namespace std;void bInsertSort(int a[],int n) //插入排序{ int low,high,mid; int temp; for(int i=1;i<n;i++) { low=0; //把a[i原创 2017-12-14 23:14:36 · 1009 阅读 · 0 评论 -
八种排序方法(四)——快速排序
编译器:Xcode 编程语言:C++源程序:#include <iostream>using namespace std;int findPos(int a[],int low,int high){ //将小于t的元素赶到t的左边,大于t的元素赶到t的右边 int t=a[low]; while(low<high) { while(low<hi原创 2017-12-15 14:53:53 · 1188 阅读 · 0 评论 -
八种排序方法(五)——希尔排序
编译器:Xcode 编程语言:C++源程序:#include <iostream>using namespace std;void shellSort(int *a,int n) //希尔排序{ int key,j; for(int step=n/2;step>0;step/=2) //将数组按照step分组,不断二分到每组只剩下一个元素 { for(原创 2017-12-15 16:02:59 · 600 阅读 · 0 评论 -
八种排序方法(六)——堆排序
编译器:Xcode 编程语言:C++源程序:#include <iostream>using namespace std;void swap(int a[],int i,int j) //交换函数{ int temp; temp=a[i]; a[i]=a[j]; a[j]=temp;}void heapAdjust(int a[],int i,int n)原创 2017-12-17 14:44:36 · 767 阅读 · 0 评论 -
八种排序方法(七)——归并排序
编译器:Xcode 编程语言:C++源程序:#include<iostream>using namespace std;void merge(int a[],int low,int mid,int high){ int i,k; //定义一个临时数组存放传进来的无序数组排好序之后的数组 int *temp=(int *)malloc((high-low+1)*size原创 2017-12-17 16:50:09 · 509 阅读 · 1 评论 -
八种排序方法(八)——基数排序
编译器:Xcode 编程语言:C++源程序:#include<iostream>using namespace std;//该函数的作用是找出num的pos位数的数字(比如:23的个位数数字是3)int getNumPos(int num,int pos){ int i; int temp=1; for(i=0;i<pos-1;i++) temp*=原创 2017-12-17 17:07:51 · 414 阅读 · 0 评论 -
二叉排序树的建立与中序遍历
编译器:Xcode 编程语言:Cdata1.txt文本数据为上图,在我的电脑里它的存储位置是:/Users/wsw/Desktop/数据结构/data1.txt#include<stdio.h>#include<stdlib.h>#define N 100typedef struct node //二叉排序树结点定义{ int key;原创 2017-12-20 21:30:11 · 7647 阅读 · 0 评论 -
平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回true示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] ...原创 2018-09-25 10:46:41 · 167 阅读 · 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通过此题掌握树的知识和递归的运用题目分析:题目的意思是给...原创 2018-09-25 23:15:49 · 168 阅读 · 0 评论 -
将有序数组转化为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5通...原创 2018-09-26 15:31:15 · 331 阅读 · 0 评论