数据结构与算法
cherrydreamsover
这个作者很懒,什么都没留下…
展开
-
剑指offer--找出字符串中第一个只出现一次的字符(题面已经更新)C++
题目描述:找出字符串中第一个只出现一次的字符输入描述:输入一个非空字符串输出描述:输出第一个只出现一次的字符,如果不存在输出-1示例1 输入asdfasdfo 输出ö代码实现如下:#include<iostream>#include<string>#include<map>using namespace std;i...原创 2018-08-23 08:17:39 · 2038 阅读 · 0 评论 -
平衡二叉树:输入一颗二叉树,判断该二叉树是否是平衡二叉树?(C++)
题目描述:输入一颗二叉树,判断该二叉树是否是平衡二叉树?思路分析:平衡二叉树是指它的左右子树深度相差小于等于1。因此我们需要先求出该二叉树树左右子树的深度,然后看他们的差是否小于等于1代码实现:class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot==NUL...原创 2018-08-11 11:02:41 · 865 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列(C++)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路分析:我们首先要知道二叉搜索树的性质(即就是:二叉树搜索树它的左子树都比根节点小,右子树都比根节点大,并且二叉搜索树的中序遍历是有序的)。根据这个思路我们再结合递归,来进行二叉搜索树的后序遍历。还有就是后序遍历的顺序是左子树–>右子...原创 2018-08-11 10:29:22 · 835 阅读 · 0 评论 -
剑指offer--对称的二叉树(C++)
题目描述:请实现一个二叉树,判断一颗二叉树是否是对称的。注意,一颗二叉树和它的镜像完全相同,则称为对称二叉树。思路分析:要想成为一个对称二叉树,要满足两点:二叉树在结构上必须对称,对称结构的对称位置数据的值相同。本题我们可以使用递归,判断一颗二叉树是否为对称二叉树。代码实现:/*struct TreeNode { int val; struct TreeNode ...原创 2018-08-14 10:21:35 · 925 阅读 · 3 评论 -
剑指offer--二叉树的镜像、二叉树的深度
最近,我会将自己写的看到的并且弄懂的题写进我的博客中,下面我们就一起来看看吧!一、二叉树的镜像题目描述:题目:给定二叉树,将其变换为源二叉树的镜像。题目:给定二叉树,将其变换为源二叉树的镜像。二叉树的定义如下:struct TreeNode{int val;TreeNode* left;TreeNode* right;};输入描述:二叉树的镜像...原创 2018-08-09 19:37:36 · 293 阅读 · 1 评论 -
末尾0的个数--C++
题目描述:输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2输入描述: 输入为一行,n(1 ≤ n ≤ 1000)输出描述: 输出一个整数,即题目所求输入例子1: 10输出例子1: 2思路分析:最开始看到这个题目的时候我想到了求阶乘,然后再算0的个数,可以说是特别特别笨的想法,或者说都不算是一种解题思路,是根...原创 2018-07-27 17:35:25 · 3797 阅读 · 2 评论 -
剑指offer--二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路:按照本题的意思,我们能想到的就是根据二叉树的中序遍历,因为中序遍历是:左子树–>跟–>右子树,由于二叉搜索树它的根节点大于左子树,小于右子树的,所以,只要我们将跟的左指向它左子树中最大的一个子树,让它跟的右指向右子树中最小的元素,就做到了将二叉搜索...原创 2018-08-04 19:31:32 · 235 阅读 · 0 评论 -
进制转换--给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数C++
题目描述给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数输入描述: 输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。输出描述: 为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)示例1 输入 7 2输出 111代码实现:#include&l...原创 2018-07-27 16:04:09 · 5035 阅读 · 0 评论 -
排序(二)--选择排序:选择排序、堆排序
一、选择排序(以升序为例)1.算法思想在整个区间中找出排序码最小的元素,如果这个元素不是这组序列中的第一个元素,那么将它和第一个元素进行交换,使得最小的元素就在第一个位置,然后缩小区间,循环执行上述操作,只到区间中只剩下一个元素。 注意:选择排序和冒泡排序有相似之处,以升序为例,都是将最小的数放在最前面。但是不同之处在于冒泡排序是对于两个相邻数进行比较和交换,而选择排序是对于...原创 2018-07-22 21:27:17 · 256 阅读 · 0 评论 -
LeetCode--sort list(C++)
题目描述:Sort a linked list in O(n log n) time using constant space complexity. 题目翻译: 在O(nlogn)时间内,使用常数空间对链表进行排序。题目分析:本题让我们对链表进行排序,我们需要用到归并排序的思想。归并排序:就是将数组中的元素分成两个部分,对每一部分进行排序,然后再对整体进行排序。(我在之前的博客中有...原创 2018-08-03 21:33:39 · 382 阅读 · 0 评论 -
LeetCode--Reorder List(C++)
问题描述:Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…You must do this in-place without altering the nodes’ values.For example, Given {1,2,3,4}, reorder it to...原创 2018-08-03 21:10:34 · 257 阅读 · 0 评论 -
LeetCode--partition-list(C++)
题目描述:Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.You should preserve the original relative order of the nodes in ea...原创 2018-08-07 10:17:10 · 472 阅读 · 1 评论 -
LeetCode--Binary Tree Preorder Traversal(C++)
题目描述: Given a binary tree, return the preorder traversal of its nodes’ values. For example:Given binary tree {1,#,2,3},1 \ 2 / 3 return [1,2,3].思路分析: 本题是一个二叉树遍历的常规题目。用非递归...原创 2018-08-14 21:58:32 · 435 阅读 · 0 评论 -
LeetCode--Recover Binary Search Tree(C++)
题目描述: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure.Note: A solution using O(n) space is pretty straight forward. Could you d...原创 2018-08-19 20:55:09 · 287 阅读 · 0 评论 -
LeetCode--Validate Binary Search Tree(验证二叉搜索树)C++
题目描述:Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:The left subtree of a node contains only nodes with keys less than the node’s key. ...原创 2018-08-19 19:36:23 · 445 阅读 · 0 评论 -
LeetCode--Minimum Depth of Binary Tree(C++)
题目描述: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.题目分析:本题我们还是用递归,分为四种情况: (1)左右子树...原创 2018-08-16 21:19:19 · 248 阅读 · 0 评论 -
LeetCode-- Binary Tree Postorder Traversal(C++)
Given a binary tree, return the Postorder traversal of its nodes’ values. For example:Given binary tree {1,#,2,3},1 \ 2 / 3 return [3,2,1].本题和我之前做过的一个类似的题:Binary Tree Preorder Traver...原创 2018-08-16 17:54:04 · 314 阅读 · 1 评论 -
LeetCode--same tree(C++)
题目描述:Given two binary trees, write a function to check if they are equal or not.Two binary trees are considered equal if they are structurally identical and the nodes have the same value.翻译:给定两个二叉...原创 2018-08-18 11:10:49 · 296 阅读 · 0 评论 -
LeetCode--construct binary tree from inorder and postorder-traversal(根据中序和后序遍历重建二叉树)C++
题目描述:Given inorder and postorder traversal of a tree, construct the binary tree.Note: You may assume that duplicates do not exist in the tree.思路分析:本题要求我们通过二叉树的中序和后序遍历还原这个二叉树,我们知道二叉树的中序遍历的顺序是:左子树–...原创 2018-08-18 11:00:19 · 439 阅读 · 0 评论 -
剑指offer--把二叉树打印成多行(C++)
题目描述:从上到下按层打印二叉树,同一层节点从左往右输出,每一层输出一行。问题分析:这个问题就是二叉树的层序遍历,之前我的博客中曾写到过“锯齿型层序打印二叉树”,和本体思路基本一样,并且本题相对那个题较简单一些,我将那篇博客的连接放在这里:https://blog.csdn.net/cherrydreamsover/article/details/81051663代码实现:/*s...原创 2018-08-08 20:34:39 · 519 阅读 · 1 评论 -
LeetCode--LeetCode:Remove Nth Node From End of List(C++)
题目描述:Given a linked list, remove the nth node from the end of list and return its head.For example,Given linked list: 1->2->3->4->5, and n = 2.After removing the second node from the...原创 2018-08-08 09:22:16 · 196 阅读 · 0 评论 -
LeetCode--add-two-numbers(反序链表求和)C++
题目描述:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a...原创 2018-08-07 20:54:57 · 233 阅读 · 0 评论 -
LeetCode--convert-sorted-list-to-binary-search-tree(C++)
题目描述:Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.思路分析:由于给出的单链表是已经排序好的,本题我们只需要找到中间节点,将其标记为树的根,然后分别递归调用左子树和右子树。代码实现如下:/** * Def...原创 2018-08-07 10:55:39 · 185 阅读 · 0 评论 -
数字和为sum的方法数--C++
题目描述:给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入描述: 输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000) 第二行为n个正整数Ai,以空格隔开。输出描述: 输出所求的方案数示例1 输入 5 15 5 5...原创 2018-07-27 10:52:43 · 7337 阅读 · 0 评论 -
LeetCode--Linked List Cycle(C++)
题目描述:Given a linked list, determine if it has a cycle in it.Follow up: Can you solve it without using extra space?题目翻译:给定一个链表,确定它是否有环。 进阶: 你可以不使用额外的空间解决它吗? 代码实现:/** * Definition for si...原创 2018-08-03 19:37:06 · 184 阅读 · 0 评论 -
数组中的重复数字
题目描述:在一个长度为n的数组里面的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。题目分析:一开始我想到的办法是,将该数组遍历一遍,去找出数字重复的元素,但是这样的做法的时间复杂度是O(n^2)。有一种简便...原创 2018-06-07 09:52:38 · 437 阅读 · 0 评论 -
顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针打印出每一个数字,例如:输入如下矩阵,则依次打印出的数字为:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10.思路分析:当我们顺时针打印该矩阵时,每一圈的起始位置是左上角的元素,并且每一圈左上角元素都有一个共同点:它的行和列所对应的的下标都是相同的。因此不难想到,该矩阵打印结束的条件就是左上角的元素下标走到了该矩阵行和列的一半...原创 2018-05-31 10:09:42 · 13050 阅读 · 0 评论 -
二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和整数,判断数组中是否含有该整数。解题思路:我们以下面3*3的矩阵(该矩阵符合题目的要求)为例,对该题进行分析。当我们要查找的元素为“10”时,由于该矩阵中不存在,因此返回false,当我们要查找的元素为“5”时,由于该矩阵你 中存在,因此返回true。通过观察...原创 2018-05-30 09:25:22 · 958 阅读 · 2 评论 -
Rotate List---C++
题目描述:Given a linked list, rotate the list to the right by k places, where k is non-negative.(给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。)Example 1:Input: 1->2->3->4->5->NULL, k = 2Output:...原创 2018-06-11 18:18:55 · 317 阅读 · 0 评论 -
字符串翻转&左旋字符串
一、翻转字符串题目要求:输入一个英文句子,翻转句子中的单词顺序,但是单词内部的顺序并没有改变。(其中,标点符号也和普通字母一起处理),例如:"I like travelling!",输出为“travelling! like I!”解题思路:这个题比较简单,思路大致分为两步。1.翻转整个字符串的顺序,结果是“!gnillevart ekil I”;2.翻转由第一步得到的整个字符串中的每一个...原创 2018-05-28 16:56:26 · 310 阅读 · 0 评论 -
和为S的两个数字VS和为S的连续正数序列
题目一:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得它们的和正好是S。如果有多对数字的和等于S,输出任意一对即可。例如:输入数组{1,2,4,7,11,15}和数字15,输出应该是4和11.思路分析:看到这个题最开始我就想到了,从该数组的第一个数字开始固定数字,求该数字和其余的n-1个数字之和,找到S即可,但是这个方法的时间复杂度是O(n^2).有一种简单的思想,我们可以定义连个指...原创 2018-06-03 21:27:07 · 139 阅读 · 0 评论 -
空格替换
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“We are happy”,输出为“We%20are%20happy”.在做题之前,我们先做一点小小的知识铺垫,每一件事情的产生都有它的原因,就好像空格替换的产生!之所以有空格替换,是因为在网络编程中,若URL参数中有特殊的字符,例如空格、‘#’等等,可能会导致服务器无法获得正确的参数。只有将这些特殊字符转换成服务器可以识别的...原创 2018-05-27 21:19:54 · 406 阅读 · 0 评论 -
用两个栈实现一个队列&用两个队列实现一个栈
做题之前,我们先来回顾一下“栈和队列的相同点以及不同点”,便于做题时的应用!1.区别与联系相同点:(1)栈和队列都是控制访问点的线性表; (2)栈和队列都是允许在端点处进行数据的插入和删除的数据结构;不同点:(1)栈遵循“后进先出(LIFO)”的原则,即只能在该线性表的一头进行数据的插入和删除,该位置称为“栈顶”, 而另外一头...原创 2018-05-27 11:12:48 · 77360 阅读 · 12 评论 -
设计一个有getMin功能的栈(C++版)
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。要求:pop、push、getMin操作的时间复杂度都是O(1)这个题我们有两种解决办法,如下:1.使用两个栈,一个栈用来保存当前的元素,记做:stackData,一个栈用来保存压入操作每一步的最小元素,记做:stackMin。入栈:当stackData栈中压入一个数据时,判断satckMin中是否为空。若为空,将该...原创 2018-03-07 21:40:09 · 2171 阅读 · 1 评论 -
二叉搜索树
一、概念二叉搜索树(Binary Search Tree)又称:二叉排序树。这棵树要么是一颗空树,要么是一颗具有以下性质的树:1.若它的左子树不为空,则所有左子树上的值均小于其根节点的值;2.若它的右子树不为空,则所有右子树上的值均大于其根节点得值;3.它的左右子树也分别为二叉搜索树。例如:int a[] = { 5, 3, 4, 1, 7, 8, 2, 6, 0, 9 }原创 2018-01-31 18:40:29 · 205 阅读 · 0 评论 -
构建乘积数组
题目描述:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。题目分析:首先我们得看清楚了,矩阵A的的A[i]位置上面的元素没有参与运算,因此,我们将B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]看成两部分来计...原创 2018-06-07 11:03:58 · 415 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述:数组中有一个数字的次数超过数组长度的一半,请找出这个数字。例如在一个长度为9的数组{1,2,3,2,2,2,5,4,2}中,数字2在该数组中出现了5次,超过数组长度的一半,因此输出2.思路分析:我们利用数组的特点,找一下规律(一上述数组为例):数字“2”出现的次数超过了该数组长度的一半,也就是说:该数组中其他元素的出现的次数之和也没有数字“2”的次数多。基于这个思路,我们来定义两个数字:...原创 2018-06-02 10:01:40 · 1429 阅读 · 0 评论 -
到Fibonacci数最小步数--C++
题目描述: Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前...原创 2018-07-16 20:31:27 · 399 阅读 · 0 评论 -
字符串中找出连续最长数字串(两种题型)--C++
题目描述一:读入一个字符串str,输出字符串str中的连续最长的数字串输入描述: 个测试输入包含1个测试用例,一个字符串str,长度不超过255。输出描述: 在一行内输出str中里连续最长的数字串。输入 abcd12345ed125ss123456789输出 123456789思路分析:将字符串中数字串分离出来,并且要计算出来哪个数字串的长度最长,需要做的工作就是将每一段的数...原创 2018-07-29 14:59:56 · 9066 阅读 · 0 评论 -
排序(一)--插入排序:直接插入排序、希尔排序
排序是一种常用的数据结构,当有人问我具体有哪些排序呢?我说有选择、冒泡、快排、希尔……说着说着自己就觉得乱乱的,还是来一个系统的总结吧!一、排序分类比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排...原创 2018-07-20 21:55:49 · 295 阅读 · 0 评论