自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指offer 数组中只出现一次的数字

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:如果只有一个数字只出现一次,那么我们直接异或所有数字,最终的结果就是所求。这里用到了异或的两个性质:AxorA=0 和 Axor0=A,因为两个相同的数字异或为0,最终和那个单独的数字异或就是所求。但是本题要求出的是两个,不过这个也ok。还是老套路先异或所有值,得到的一定是那两个单独出现的数字

2016-08-20 15:56:02 493

原创 堆排序 C++实现

堆是一种数据结构,实际上是一渴完全二叉树,它满足以下性质: 对于大顶堆而言,其所有的父节点都大于其子节点。基本思想:1、按照下标建立一棵完全二叉树 2、从最后一个非叶子节点开始与其左右孩子比较,将三者最大的点交换为父节点。每个非叶子节点都这样比较,直到根结点。 3、此时根结点一定为最大的节点,将该节点与最后一个节点交换,重复2,直到所有节点都完成上述操作为止。具体实现:#include <cs

2016-03-17 10:15:11 431

原创 剑指offer 二叉搜索树的后序遍历序列

题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:根据二叉搜索树的性质我们可知,根结点左子树的所有节点全都小于根结点,右子树的所有节点全都大于根结点。又又后序遍历我们可知,最后一个点是根结点,因此递归判断左(右)子树是否小于(大于)根结点的值即可。#include <cstdio> #incl

2016-03-15 18:37:29 365

原创 剑指offer 栈的压入、弹出序列

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路: 模拟入栈操作。定义两个指针,p1,p2,分别指向入栈序列和弹出序列,如果栈顶元素等于当前p2指向的弹出序列元素,则

2016-03-15 17:17:20 423

原创 剑指offer 包含min函数的栈

题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路:这题的难点在于维护最小值。我们可以定义一个结构体,保存当前的值,并且保存到目前为止的最小值,这样,删除操作后,它的最小值的查询操作就是O(1)。这也是空间换时间的例子。#include <cstdio> #include <cstdlib> using namespace std;typedef struct

2016-03-15 16:45:29 343

原创 剑指offer 顺时针打印矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:递归打印,处理好边界就OK了#include <cstdio> #include <algorithm> usi

2016-03-13 11:26:03 377

原创 剑指offer 合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 (hint: 请务必使用链表。)思路:首先新建一个链表,因为连个链表都是有序的,所以只需要在一个链表的基础上添加另一个的元素即可。具体做法:维护链表内的一个指针,当要插入第二个链表的元素时,这个指针从头遍历链表,当当前节点大于等于要插入的元素时,将其插入到这个节点的前部,保存指针指向新插入的

2016-03-13 10:07:11 358

原创 剑指offer 反转链表

题目描述: 输入一个链表,反转链表后,输出链表的所有元素。 (hint : 请务必使用链表)和这道题一样。。 http://blog.csdn.net/s_h_r/article/details/50781947#include <cstdio> using namespace std;typedef struct Node{ int val; Node *next;

2016-03-12 17:43:38 290

原创 剑指offer 链表中倒数第k个结点

题目描述: 输入一个链表,输出该链表中倒数第k个结点。 (hint: 请务必使用链表。)思路: 单向链表,故不能倒着来,我们可以定义两个指针p1,p2,对于倒数第k个,我们先令p1走k步,然后两个指针一起走,如果p1到了结尾,则p2所对应的值就是所求。#include <cstdio> using namespace std;typedef struct Node{ int val;

2016-03-12 16:38:43 373

原创 剑指offer 调整数组顺序使奇数位于偶数前面

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路: 其实这道题我的第一想法就是利用归并排序的思想来实现,但是这样的话时间复杂度会是O(nlogn),空间复杂度是O(n),不可取。既然是移动操作,在数组上必然很费时间,因此我想到了用双向链表来实现,这样的话时间

2016-03-12 16:04:37 410

原创 归并排序 C++实现

归并排序是众多排序算法中的一种,它采用分治递归的方法,时间复杂度为O(nlogn),空间复杂度为O(n)。基本思想是首先将整个区间分成两部分,分别对其进行求解,再对这两部分再次分解,直到区间分得足够小的时候进行计算,最终再合并。#include <cstdio> #include <cstring> using namespace std;void Merge(int *arry, int left

2016-03-12 10:28:57 406

原创 剑指offer 打印1到最大的N位数

题目描述: 给定一个数字N,打印从1到最大的N位数。思路:如果用for循环,那么这道题将毫无意义。如果N不是5而是100,还能用for循环吗。我的做法是dfs回溯求全排列,注意不要讲前导零输出。#include <cstdio> #include <cstring> using namespace std;int num[10]; int n;void dfs(int cur){ if(c

2016-03-11 22:10:19 337

原创 剑指offer 数值的整数次方

题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。注意控制精度就OK#include <cstdio> #include <cmath> #include <cstdlib> using namespace std;const double eps = 1e-8;int main() { int T; doub

2016-03-11 21:39:35 312

原创 剑指offer 二进制中1的个数

题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。一道好题!! 做完这道题,加深了我对计算机存储数字的形式以及位运算的理解!!假设一个int为8字节在计算机中,一个数字以二进制的形式存储,对于一个int类型的数字,最高位为符号位,0为正,1为负。他们全都是以补码的形式存储的。对于一个正整数,它的原码反码补码都是它的二进制表示,而对于一个负数,它的源码是其相反数的二进制表

2016-03-11 19:21:29 452

原创 快速排序C++实现

快速排序采用分治递归法,将问题分解为一个个小的问题,再递归求之。 大致思想为: 首先对于一个区间L,R,找到一个元素p,将所有大于p的元素全部移动到p的右边,所有小于p的元素全部移动到p的左边,这样就大致将顺序整理了一下,然后对于p左边的区间L1,R1,递归上述方法,右区间同理。#include <cstdio> using namespace std;void QuickSort(int *a

2016-03-10 22:10:46 315

原创 剑指offer 矩形覆盖

题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路: 2*1的情况只有一种 2*2的情况,当第一块横着放的时候第二块也必须横着放,当第一块竖着放的时候,会发现剩余部分又是2*1的情况 2*3的情况,当第一块横着放,剩余2*1,当第一块竖着放,剩余2*2的情况 因此,f[n] = f[n-1] +

2016-03-10 19:01:06 280

原创 剑指offer 变态跳台阶

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路: f[0] = 1 对于跳一级台阶,有1种方法,即为f[1] = 1 对于跳二级台阶,可以从一级跳上,也可以直接从零级跳,故有f[2] = f[1] + f[0] 对于跳三级台阶,可以从一级跳到三级,也可以从二级跳到三级,也可以直接跳到三级,f[3] = f[2]

2016-03-10 17:56:40 325

原创 剑指offer 跳台阶

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路: 跳第零个台阶有也算1种方法#include <cstdio> #include <iostream> using namespace std; int main() { long long f[100]; f[0] = 1; f[1] = 1; for(i

2016-03-10 17:39:03 219

原创 剑指offer 斐波那契数列

题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下: #include <cstdio> #include <iostream> using namespace std; int main() { long long f[100]; f[0] = 0; f[1] = 1; for(int i = 2;

2016-03-10 17:28:22 244

原创 剑指offer 旋转数组的最小数字

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路: 对于有序的集合,要想找到其中的某一个值,最常用的方法就是二分查找,但是这个题中的数组并不是严格单调的,而是分成两个区域分别单调,因此我们不能用普通的二分查找。具体步骤为

2016-03-10 17:09:51 582

原创 剑指offer 用两个栈实现队列

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路: 我的第一反应就是 现将数据压入一个栈内,然后在需要取出时再压入另一个栈中,pop完之后再压入原来的栈内。。。这样pop的复杂度就是O(n)了 网上有更高效的操作,即当s1压入另一个栈s2的时候,不着急存回去,而是再pop的时候直接在s2pop,当然push还是在s1中,当s2为0时,再将s

2016-03-10 13:02:45 268

原创 剑指offer 重建二叉树

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。思路: 先序遍历的第一个节点即为根结点,而中序遍历中,该节点左边的节点为左子树节点,右边的为右子树的节点,因此根据这些节点区间可以确定

2016-03-10 12:23:20 277

原创 剑指offer 从尾到头打印链表

题目描述: 输入一个链表,从尾到头打印链表每个节点的值。思路: 很多方法,最有用的就是真的实现一个链表然后进行操作。 一开始我的做法是每次插入先从头结点遍历到尾结点,然后进行插入操作,但是TLE了,最后发现其实插入操作只需要O(1),即用一个新的指针维护尾部节点。递归方式插入还是O(n)…#include <cstdio> #include <stack> using namespace st

2016-03-08 20:54:43 354

原创 剑指offer 替换空格

题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路: 将一整行拆分成若干单词,直接输出单词,碰到空行直接输出%20…#include <cstdio> #include <string> #include <iostream> using namespace std;strin

2016-03-08 17:35:04 289

原创 剑指offer 二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:我们都能想到O(n2)的算法。 但是有一个更好的O(n+m)的算法。根据题目给出的数组的性质我们可以推出一些规律,即:如果当前数字cur大于题目所给数字t,则cur所在行右边的元素以及下边元素都大于t,如果小于t,

2016-03-08 17:02:25 241

原创 LeetCode 235. Lowest Common Ancestor of a Binary Search Tree

题意:求一颗二叉搜索树的上两个节点的最小公共子序列思路:我们根据BST的性质可知,对于一个节点p,如果存在左子树,那么它左子树上的点全都小于p,如果存在右子树,那么它右子树上的点都大于p。因此根据这个性质,我们可以知道如果这两个节点的值都小于p,则他两个一定在p的左子树上,如果都大于p,则一定在其右子树上。递归:class Solution{ public: TreeNode* lowest

2016-03-07 16:57:26 344

原创 二叉树的递归与非递归遍历实现

参阅资料:http://blog.csdn.net/ns_code/article/details/12977901 二叉树是很常见的数据结构, 它的遍历方式有递归和非递归两种,其中递归方式易于实现,而非递归的方式往往效率更高,耗资源更少,各有千秋,下面就来介绍下具体的实现方法。节点结构:typedef struct Node{ int val; Node* left; N

2016-03-06 20:44:01 464

原创 二叉搜索树(BST)递归与非递归的插入、删除、查找的实现

昨天碰到了二叉搜索树(BST)这种数据结构,索性详细的学习了一遍。BST的定义: 如果一棵树的左子树不为空,那么其所有节点的值均小于其根结点的值,如果右子树不为空,那么其所有节点的值均大于其根结点的值,它的左右子树也满足如上性质。空树也是BST。我的BST的实现是以没有重复元素为前提,其实有重复元素也无大碍,只是把实现过程中相关的<改成<=即可,节点结构定义:class Node{ pub

2016-03-03 18:06:40 6945 1

原创 LeetCode 13. Roman to Integer

题意:罗马数字转十进制数字思路:首先要知道一些罗马数字的组合规则: I:1 V:5 X:10 L:50 C:100 D:500 M:1000 小的在大的前面相减,如:IV:4,CD:400 打的在小的前面相加,如:VI:6,DC:600 最多只能有一个小的在大的前面 而且小的在大的的前面只能有 XL XC CD CM IX IV 这几种形式,不能有IC这种表示99,可以用XCIX表示之

2016-03-02 19:45:20 380

原创 LeetCode 206. Reverse Linked List

题意:反转一个单向链表递归:class Solution{ public: ListNode *reverseList(ListNode *head){ if(head == NULL || head->next == NULL){ return head; } else{ ListNode *P

2016-03-02 18:06:47 342

原创 LeetCode 169. Majority Element

题意:找出一个数组中出现次数大于n/2的那个元素 思路:我的思路就是用map。。。但显然是个很low的方法。网上大神的做法是删除任意两个不相同的元素,最终剩下的那个元素就是所求。class Solution{ public: int majorityElement(vector<int> &nums){ int count = 0; int tar;

2016-02-16 10:13:45 313

原创 LeetCode 171. Excel Sheet Column Number

题意:给你一个列的字母表示,让你还原成十进制的数字表示class Solution{ public: int pow_(int n){ int res = 1; for(int i = 0; i < n; i++) res *= 26; return res; } int titleToNumber(string s){ int

2016-02-16 08:47:45 211

原创 LeetCode 217. Contains Duplicate 哈希

题意:给你一个数组,问你其中有没有相同的元素。 思路:这个题有1W种解法,但是为了练习嘛,我就选了用哈希表来做这道题目。。。虽然麻烦。。但是达到了训练的目的。。。class Solution{ private: const static int MOD = 1000007; struct HashMap{ int val; HashMap *next;

2016-02-15 18:26:48 253

原创 LeetCode 242. Valid Anagram

题意:问你两个字符串里面所包含的字符是否相同class Solution { public: bool isAnagram(string s, string t) { if(s.length() != t.length()) return false; int *alphaNumS = new int[26]; int

2016-02-11 19:29:11 256

原创 LeetCode 100. Same Tree

题意:判定两颗二叉树是否相同 非递归的写法就是bfs逐层遍历 递归:class Solution{ public: bool isSameTree(TreeNode *p, TreeNode *q){ if(p == NULL && q != NULL) return false; if(p != NULL && q == NULL

2016-02-11 15:40:37 319

原创 LeetCode 283. Move Zeroes

题意:将所有的0移动到数组最后面class Solution{ public: void moveZeroes(vector<int> &nums){ int zeroes = 0; for(vector<int>::iterator it = nums.begin(); it != nums.end(); ){ if(*it == 0

2016-02-11 12:47:38 270

原创 LeetCode 237. Delete Node in a Linked List

题意:给你一个单向链表,删除一个非末节点。class Solution { public: void deleteNode(ListNode* node) { if(node == NULL || node->next == NULL) return; node->val = node->next->val; node-

2016-02-11 12:41:22 334

原创 LeetCode 104. Maximum Depth of Binary Tree

题意:求一棵二叉树的高度 思路:这里要说一下非递归的写法,就是bfs逐层遍历整棵二叉树,当遍历完一层深度就加一,这里也用到了queue的FIFO特性。 递归:class Solution { public: int maxDepth(TreeNode* root) { if(root == NULL) return 0; retur

2016-02-11 11:04:55 285

原创 LeetCode 292. Nim Game

很简单的一道Nim游戏题class Solution { public: bool canWinNim(int n) { return n % 4 != 0; } };

2016-02-11 09:15:51 269

原创 LeetCode 226. Invert Binary Tree

题意:给你一颗二叉树,让你将这棵树反转。 思路:可以使用递归与非递归两种方式,没什么好说的。。。 递归:class Solution{ public: TreeNode *invertTree(TreeNode *root){ if(root == NULL) return NULL; TreeNode *saveLeft = ro

2016-02-11 09:03:21 282

空空如也

空空如也

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

TA关注的人

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