数据结构与算法-刷题
超超级钢铁侠
每天进步一点点
展开
-
动态规划学习(1)-数字三角形问题
为了能掌握动态规划的求解方法,以后会做大量的DP题目,也会把必要的笔记记录下来。 题目: 用递归的方法是可以解决的,以D(i,j)表示第i行第j个数字(从1开始计算),想象用一个方格网将数字三角形装起来,下一步只能是D(i+1,j)或D(i+1,j+1),递归的出口是D(1,1). 下面给出程序:#include<iostream>using namespace std;#define MA原创 2016-08-12 14:30:20 · 443 阅读 · 0 评论 -
LeetCode OJ(7.Reverse Integer)
题目: Reverse digits of an integer.Example1: x = 123, return 321 Example2: x = -123, return -321 目前为止做过最简单的一个leetcode题目,解法如下:class Solution {public: int reverse(int x) { long long sum =原创 2016-08-31 16:05:54 · 207 阅读 · 0 评论 -
剑指offer(2)-Power()函数
题目:实现函数double power(double base,int exponent)函数,求base的exponent次方,不得使用库函数,不用考虑大数问题。 一看题目很快可以写出如下的代码:int Power(int base, int exp){ int result = 1; for (int i = 0; i < exp; i++) { re原创 2016-09-29 21:03:07 · 455 阅读 · 0 评论 -
剑指offer(4)-O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,链表结点与 函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);按照常规做法,从头结点一个一个顺序查找肯原创 2016-10-04 18:17:23 · 209 阅读 · 0 评论 -
剑指offer(3)-打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数,如输入3则打印出1、2、3到999。 看到题目,第一想法是从1到n 位最大的十进制数循环打印,分分钟写出类似如下的代码:void Print1ToNDigits(int n){ int sum = 0; for (int i = 0; i < n; i++) { sum += 9 * pow(10,原创 2016-10-03 16:46:47 · 232 阅读 · 0 评论 -
剑指offer(6)-链表中倒数第k个结点
题目:输入一个结点,输出链表中倒数第k个结点,规定尾结点为倒数第一个结点。 本题相对比较简单,只是要考虑到程序鲁棒性,处理好各种情况才能答得比较好,用双指针法,第一个先走到k-1个结点的时候第二个指针才开始走,等到第一个指针->next为NULL时,第二个指针刚好在倒数第k个位置。 贴出在牛客网上通过的代码:class Solution {public: ListNode* FindK原创 2016-10-07 23:38:24 · 242 阅读 · 0 评论 -
剑指offer(7)-反转一个链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点,链表结点定义如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }很经典的问题,具体思路基本上所有同学都知道了,定义3个指针,分别指向当原创 2016-10-09 21:59:10 · 401 阅读 · 0 评论 -
剑指offer(8)-合并两个有序链表
题目: 输入两个递增排序的有序链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的,链表结点的定义如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};简单地用递归实现,主要是注意写出递归出口条件,细原创 2016-10-11 19:17:28 · 373 阅读 · 0 评论 -
剑指offer(9)-树的子结构
题目: 输入两颗二叉树A和B,判断B是不是A的子结构,二叉树结点的定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};原创 2016-10-12 22:29:40 · 319 阅读 · 0 评论 -
剑指offer(10)-打印二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树的结点定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }}原创 2016-10-14 22:20:37 · 323 阅读 · 0 评论 -
LeetCode OJ(6.ZigZag Conversion)
题目练习的意义不大,主要是找到数学规律。class Solution {public: string convert(string s, int nRows) { string result; if (nRows <=1) return s; for (int i = 0; i < nRows; ++i) { for转载 2016-08-28 15:35:27 · 391 阅读 · 0 评论 -
LeetCode OJ(5.Longest Palindromic Substring)
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.思路一:求解最长回文子串的长度问题是非常经典原创 2016-08-24 09:05:29 · 211 阅读 · 0 评论 -
动态规划问题(2)-最长上升子序列
题目: 类似求解三角数字的那个问题,可以采用递归的方法,但是用动态规划效率会比较高,而且可以不用写递归函数。子问题可以是b[N-1]~b[N]的最长上升自序列,不停地递归,直到b[1]~b[N]的最长上升子序列和,位置k即为状态,状态的值即为到第k个位置的最长上升子序列长度。 状态转移方程可以是MaxLength[k] = max(left_MaxLength[i]) + 1,即第k个位置左边i原创 2016-08-12 16:19:08 · 311 阅读 · 0 评论 -
两个栈实现一个队列
《剑指offer》读书笔记 题目: 用两个栈实现一个队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点 和队列头部删除结点的功能。思路:在纸上画画,怎样用两个栈子实现一个队列的功能呢?其实很容易就能发现规律了,假设有a,b,c三个元素,将它们一个一个按序压入栈中,假设有stack1和stack2两个栈,先将其压如stack1,原创 2016-09-16 15:08:23 · 223 阅读 · 0 评论 -
重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 解题思路参考http://blog.csdn.net/lemon_tree12138/article/details/49798221 用递归的方法,原创 2016-09-08 10:34:04 · 318 阅读 · 0 评论 -
《剑指offer》笔记(1)-Fibonacci数列
采用递归的的方法求解Fibonacci数列非常简单,也很直观,分分钟可以写出如下的代码:long long Fibonacci(unsigned int n){if(n == 0)return 0;if(n == 1)return 1;return Fibonacci(n - 1) + Fibonacci(n - 2);}然而,从递归调用树就可以知道,算法在执行过程中存在大量重复的调用原创 2016-09-26 15:48:30 · 247 阅读 · 0 评论 -
剑指offer(5)-调整数组顺序使得奇数位于偶数之前
题目:输入一个整数数组,实现一个函数来调整数组中的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。拿到题目之后,暴力方法很快就可以想到,只要从头遍历数组,遇到偶数后就提取出来,把后面的元素向前移动一位,将取出的数放到数组最后的空位就好了,这样做的话遍历数组的寻找偶数需要O(n)时间,移动数组又需要O(n)时间,总的时间就是O(n^2),意义不大。一种稍微复杂一点的方法有可能想到,用原创 2016-10-06 22:53:10 · 255 阅读 · 0 评论 -
剑指offer(18)-丑数
题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。直观的想法:从1开始一个个判断数字是否为丑数,遇见丑数就记录下来,直到找到低N个为止,不过这样计算复杂度太大。class Solution {public: int GetUglyNumber_Solutio原创 2017-01-09 16:23:46 · 262 阅读 · 0 评论 -
LeetCode OJ(2.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 contain a single digit. Add the two numbers and return it as a原创 2016-08-06 17:46:13 · 274 阅读 · 0 评论 -
LeetCode OJ(3.Longest Substring Without Repeating Characters)
从今天开始不要追求题目的数量了,学会一题多解,开阔思路,熟练写法,题目是做不完的,关键是做得有质量才能提高编程能力。 题目描述: Given a string, find the length of the longest substring without repeating characters.Examples:Given “abcabcbb”, the answer is “abc”,原创 2016-08-20 00:17:57 · 256 阅读 · 0 评论 -
LeetCode OJ(4.Median of Two Sorted Arrays)
这道题好难。。。 不是完全能看懂别人的解法,先记下来,以后再琢磨。。。╮(╯▽╰)╭class Solution {public: double findMedianSortedArrays(int A[], int m, int B[], int n) { int total = m + n; if (total & 0x1)原创 2016-08-23 15:20:01 · 231 阅读 · 0 评论 -
剑指offer(11)-包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。用双栈来解决,第一个栈用作普通栈,存放用于出栈入栈的数据,以及执行top()操作,第二个栈用于存放当前最小值(栈顶).class Solution {public: stack<int> smin; stack<int> sdata; void push(int value) { sda原创 2016-10-15 23:00:32 · 254 阅读 · 0 评论 -
剑指offer(12)-栈的压入弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为栈的弹出顺序,假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压入序列,4、3、5、1、2就不可能是该压栈序列的弹出序列。书中用双栈的方法来解决,这个方法比较麻烦也不容易理解,用一个栈就好了,只要将栈序列一个一个压入, 检测栈中是否为空,若空,说明出栈队列可由原数列进行栈操作得到。否则,说明出栈队列不能由原数原创 2016-10-16 17:29:42 · 292 阅读 · 0 评论 -
剑指offer(17)-把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。贴一下我看到的来自牛客网比较好的解答:class Solution {public: //如果题目要求得出最大的数字,可以将比较器转换成从大到小排序即可 //其中,数字转化为字符串的使用方法,参考别人的代原创 2017-01-09 15:37:37 · 337 阅读 · 0 评论 -
剑指offer(19)-第一个只出现一次的字符
题目:在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置.思路:暴力法很容易想到,复杂度为O(n^2),一种巧妙的方法是把字符看成是整数,将它ASCII码值作为索引记录字符出现的次数,类似与计数排序的思想。返回第一此次数为1的字符对应索引即可。class Solution {public: int FirstNotRepeatin原创 2017-01-16 18:11:49 · 248 阅读 · 0 评论 -
构造回文(删除字符使得回文子串最长)
题目: 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子:abcda google输出例子:2 2思路:先求解原字符串的逆置串,再求解原字符串与逆置串的最长原创 2017-02-05 21:25:38 · 2518 阅读 · 0 评论 -
字符移位
题目:小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。你能帮帮小Q吗?输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述:对于每组数据,输出移位后的字符串。输入例子:AkleBiCeilD输出例子:kleieilABCDC题目比较简单,我的做法是按顺序把大小写字符串分开,最后两个strin原创 2017-02-06 16:54:44 · 678 阅读 · 0 评论 -
剑指offer(20)-数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路: 经典题目,利用异或运算解决效率最高。异或运算规则: 0 ^ num = num, 1 ^ num = ~num, num ^ num = 0. 因此一次异或运算结束后肯定有某位不为0,找出所在位,根据这位是否为1把数组元素分为两组,再使用异或运算就可以求出这个找出这个数字。代码如下:public原创 2017-02-20 20:58:14 · 246 阅读 · 0 评论 -
剑指offer(21)-和为S的连续正数序列
题目:链接:https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 来源:牛客网小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16原创 2017-02-21 17:13:33 · 694 阅读 · 0 评论 -
反转句子单词顺序
输入一句英文,单词用空格隔开,要求在主函数里调用函数reverse()将这句话的单词从后向前翻转过来。 要求:必须使用函数void reverse(char A[]){}思路:可以先反转整个句子,再反转每个单词,也可以先反转每个单词再反转整个句子。 先反转每个单词:#include<iostream>using namespace std;void Reverseword(char s[原创 2017-02-22 21:18:58 · 913 阅读 · 0 评论 -
二叉树最低公共祖先
在笔试中遇到了二叉树最低公共祖先的问题,现在将这个问题彻底地总结一下。其实相关问题还不少,比如二叉树是BST还是普通二叉树,二叉树存在指向父结点的指针吗?1.二叉搜索树的情况,这样的情景下处理比较简单一些,前序遍历该二叉树,如果当前结点的值比两个所求结点大,则最低公共祖先肯定存在于当前结点的左子树中,如果当前结点的值比两个所求结点小,则最低公共祖先肯定存在于当前结点的右子树中,否则,当前结点即为所求原创 2017-03-22 22:13:23 · 643 阅读 · 0 评论 -
最大和子矩阵
一道经典的动态规划问题:最大和子矩阵 有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。 给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。 测试样例: [[1,2,-3],[3,4,-5],[-5,-6,-7]],3 返回:10思路: 将二维的矩阵最大原创 2017-04-19 21:30:03 · 557 阅读 · 0 评论 -
剑指offer(16)-从1到n整数中1出现的次数
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。这道题目解法非常多,非常直观的解法是:class Solution {public: int Numbe原创 2016-12-21 17:40:39 · 310 阅读 · 0 评论 -
剑指offer(15)-连续子数组的最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是原创 2016-12-19 22:00:21 · 254 阅读 · 0 评论 -
剑指offer(11)-从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按从左到右的顺序打印。二叉树结点的定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2016-10-17 23:22:55 · 231 阅读 · 0 评论 -
剑指offer(12)-二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历序列的结果,如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。经典的问题,二叉树的题目很多都是用递归来解决。注意到二叉查找树的后序序列的最后一个数为根结点数据,它应该比左孩子大,比右孩子小,根据这个特点递归地检查数组中是否所有元素都满足这个特点。下面总结几种写法(均通过了所有测试用例)。递归基本写法:cla原创 2016-10-21 22:55:39 · 259 阅读 · 0 评论 -
剑指offer(13)-二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点的定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : va原创 2016-10-23 22:09:18 · 714 阅读 · 0 评论 -
剑指offer(14)-复杂链表的复制
题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)结点定义如下:struct RandomListNode { int label; struct RandomListNode *next, *random;原创 2016-11-11 18:41:26 · 307 阅读 · 0 评论 -
剑指offer(15)-二叉搜索树与双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 二叉树结点的定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x)原创 2016-11-12 16:40:01 · 280 阅读 · 0 评论 -
Palindrome Partitioning
import java.util.*;public class Solution { ArrayList<ArrayList<String>> res=new ArrayList(); ArrayList<String> temp=new ArrayList(); public ArrayList<ArrayList<String>> partition(String原创 2016-12-10 18:09:17 · 237 阅读 · 0 评论