
5-8号开始 新刷 剑指offer 第三遍
司曹龙学编程
多学习 多努力 好好学编程
展开
-
(三)剑指offer63 机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?dfs求注意里面的count每次要更新一...原创 2018-09-02 17:58:45 · 156 阅读 · 0 评论 -
(三)剑指offer 44扑克牌顺子
思路:找出其中的王的个数(可以匹配任何数字) 求出间隔数 =nums[right]-nums[left]-1;如果差一的话代表正好 不需要补充 ;4 5之间不需要王来填补;4 6 之间需要王来匹配5代码:class Solution {public: bool IsContinuous( vector<int> nums ) { int...原创 2018-08-31 23:54:07 · 149 阅读 · 0 评论 -
(三)剑指offer 43翻转单词顺序列
“student. a am I”-----》“I am a student.”思路:反转字符串的思路反转整个字符串 反转每个单词class Solution { void my_reverse(string &str,int left,int right) { if(left>=right)return ; while(left<righ...原创 2018-08-31 23:24:29 · 110 阅读 · 0 评论 -
(三)剑指offer 42 左旋转字符串
如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:我是用的字符串的方式 利用了库函数 当然 可以用字符交换的方式class Solution {public: /*string LeftRotateString(string str, int n) { int len=...原创 2018-08-31 17:56:32 · 137 阅读 · 0 评论 -
(三)剑指offer41 和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:双索引技术;但是我没有考虑越往中间两个数的乘积越大(所以只要满足两个数相加=s的时候就直接输出)这是利用了数组的递增的性质;所以可以修改一下我的代码;class Soluti...原创 2018-08-31 17:43:20 · 179 阅读 · 0 评论 -
(三)剑指offer40 和为S的连续正数序列(滑动窗口)
思路 就是求几个连续数组的和等于sum;设置变量 left=1;right=-1;滑动窗口的初始化为不可能取得的值;int cur=0; 循环的条件while(left<sum); if(cur<sum&&right+1<sum) cur+=++right; else cur-=left++; if(cur==sum) temp.push_bac...原创 2018-08-31 17:05:27 · 161 阅读 · 0 评论 -
(三)剑指offer39 数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。思路一:map啊 肯定用map啊超简单的;需要额外的空间;思路二:异或操作;先全体异或 求出异或的结果,按照第一个为1的位数 分为两部分 为1的one;与不为1的zero数组; 再从每一个数组中求出只出现一次的那个数;代码:class Solution {public: ...原创 2018-08-31 16:12:10 · 118 阅读 · 0 评论 -
(三)剑指offer38 平衡二叉树的判断
思路:根据定义判断 dis=(left-right)《=1是否成立;方法1:求出每个节点的高度;然后再判断,递归判断左右子树是否是平衡二叉树(重复遍历了节点)方法2:把求根节点的高度的时候 记录下求得的每一个结点的高度;然后判断左右子树是不是平衡的二叉树;再判断root是不是代码:class Solution {public: //method1 /*int ...原创 2018-08-31 15:55:21 · 118 阅读 · 0 评论 -
(三)剑指offer37 二叉树的深度
思路:典型的递归回溯题代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: int Tree...原创 2018-08-31 15:51:09 · 123 阅读 · 0 评论 -
(三)剑指offaer36 数字在排序数组中出现的次数
思路1:map;需要遍历一遍 可能会超时;思路2:排序数组,体现出二分查找的优势;查找 k-0.5 k+0.5 应该插入的位置;两者相减就是;class Solution {public: int findPos(vector<int>data,int left,int right,double k) { while(left<...原创 2018-08-31 15:50:00 · 115 阅读 · 0 评论 -
(三)剑指offer35 两个链表的第一个公共节点
思路:首先遍历两个链表 求出两个链表的长度len1、len2;以及长度差dis; 让长的为list1 短的为list2; list1 走dis步; 然后list1 list2 同时走 当list1==list2 的时候找到这个公共节点;代码:class Solution {public: ListNode* FindFirstCommonNode( ListNode* ...原创 2018-08-31 15:45:37 · 123 阅读 · 0 评论 -
(三)剑指offer45 约瑟夫环的问题
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2018-09-01 15:55:01 · 154 阅读 · 0 评论 -
(三)剑指offer 46 47 求1+2+3+...+n 和 两个数之和;
46: 1+2+3+。。。。。n思路:用函数递归 ;class Solution {public: int Sum_Solution(int n) { int sum=n; return (n==0?sum:sum+Sum_Solution(n-1)); }};47、求两个数的和;(不能用四则运算)把sum 看成是^的...原创 2018-09-01 16:24:23 · 180 阅读 · 0 评论 -
(三)、剑指offer62 矩阵中的路径(递归回溯)
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字...原创 2018-09-02 16:24:56 · 187 阅读 · 0 评论 -
(三)剑指offer61 滑动窗口中的最大值 (队列中的最大值)
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,...原创 2018-09-02 15:12:26 · 149 阅读 · 0 评论 -
(三)剑指offer 60数据流中的中位数
思路:用堆;两个堆 一个最大堆 一个最小堆;vector<double>min,max;如果为奇数的时候 将往最大堆中插入;如果为偶数的时候就往最小堆中插入;最后的数据的总数为奇数 返回min[0];偶数返回(max[0]+min[0])/2;代码如下:class Solution {private: vector<double>max,mi...原创 2018-09-02 11:12:25 · 170 阅读 · 0 评论 -
(三)剑指offer 57 二叉树的之子打印(栈) 58 按行打印(队列)
1、之字形打印(两个栈);/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution ...原创 2018-09-02 01:22:23 · 178 阅读 · 0 评论 -
(三)剑指offer56 二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:中序遍历 下一个结点有两种情况当前结点有右子树的话,就找出右子树中的最左的结点; 如果没有右子树的话 就往它的父节点找,找到第一个结点是它的父节点的左子节点的结点;代码:/*struct TreeLinkNode { ...原创 2018-09-02 00:18:17 · 141 阅读 · 0 评论 -
(三)剑指offer54 链表环的入口
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:判断是否存在环,快慢两个指针相遇的节点就是pMeet; p1=pMeet,p2=Phead; 两个再同时走 直到相遇 就是入口点;方案二:用map 当 dict的值==2的时候就是入口点;/*struct ListNode { int val; struct ListNode *n...原创 2018-09-01 22:10:29 · 129 阅读 · 0 评论 -
(三、)剑指offer53 字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。 class Solution{ private: char dict[256...原创 2018-09-01 21:18:22 · 142 阅读 · 0 评论 -
(三)剑指offer52 表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路:首先看看第一位是不是+/-号 用原创 2018-09-01 20:56:08 · 126 阅读 · 0 评论 -
(三)剑指offer51 正则表达式(两种情况)
题目描述 :请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路:两种情况当前字符的下一个字符是不是 * 三种情况 匹配0个 1个两个;...原创 2018-09-01 16:30:47 · 425 阅读 · 0 评论 -
(三)剑指offer 50构建数组乘积
题目描述给定一个数组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]。不能使用除法。思路:分为上三角和下三角;class Solution {public: vector<int> multiply(const vector<i...原创 2018-09-01 16:27:17 · 170 阅读 · 0 评论 -
剑指offer(三)33题 第一次只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 思路 :哈希表啊 map啊 直接上代码:class Solution {public: int FirstNotRepeatingChar(string str) { ...原创 2018-08-15 11:00:36 · 154 阅读 · 0 评论 -
剑指offer(三) 32题 丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路可以从前遍历每个数 然后判断这个数 是不是丑数 这个会超时; 可以用丑数逐渐变大的过程 来找 进行n次 就可以 计算量减少 设置2 3 5 出现的次数cnt2 cnt3 cnt5=...原创 2018-08-15 10:52:20 · 128 阅读 · 0 评论 -
(3)剑指offer14 找出链表的倒数第K个结点
思路:1、排除异常:1是空指针,2是k小于0 3是k大于链表的长度;2、设置两个指针快慢 快的先走k-1个结点,慢的再走;/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: Lis...原创 2018-05-29 00:01:46 · 126 阅读 · 0 评论 -
(3)剑指offer 13 调整数组 是奇数位于偶数的前面,并且奇数之间的相对位置不变
思路:主要是总结出一种方法;就是不仅仅是处理奇数偶数的问题,也可能是 是不是3的倍数或者其他的;原创 2018-05-28 23:49:33 · 184 阅读 · 0 评论 -
(3)剑指offer 12 求数值的整数次方;
思路:先判断底数是不是0或者1; 如果是0的话 那么指数不能是负数;如果是1那么值为它本身如果指数是0的话 那么结果1;当然0的0次方除外;class Solution {public: double Power(double base, int exponent) { if(base==0)//如果底数是0;结果为0; return ...原创 2018-05-28 23:10:48 · 102 阅读 · 0 评论 -
(3)剑指offer 第6题 旋转数组中的最小值
1、首先想到是排序后再查找;这个想法肯定对,但是效率十分低下;2、二分查找的方法;找到中间的值与两侧的值对比;思路:while(left<right)的循环内;如果a[mid]>[right];说明左侧一直是递增的,在右侧 更新left=mid+1;如果a[mid]==a[right];这个情况就比较复杂了; 有可能全部都相等;有可能右侧全部都相等;有可能右侧的某一点之后不...原创 2018-05-16 02:30:45 · 110 阅读 · 0 评论 -
(三)剑指offer 18 顺时针遍历数组
需要维护四个变量 : left :矩阵的左边界right:矩阵的右边界upper:矩阵的上边界;buttom:矩阵的下边界遍历的顺序:左——右:[left,right] 只有这一个不用另加判断剩余的三个都要另外判断;class Solution {public: vector<int> printMatrix(vector<vector<int> ...原创 2018-06-02 20:18:53 · 551 阅读 · 0 评论 -
(3)剑指offer7 斐波那契数列
思路:方法一:递归的方法(时间复杂度非常高)动态规划的方法 动态规划:vector<int>dp(n+1);1、dp[0]=?2、状态转移 int Fibonacci(int n) { if(n==0) return 0; if(n==1) return 1; ...原创 2018-05-21 15:51:53 · 118 阅读 · 0 评论 -
(3)剑指offer11 、二进制数中1的个数;位运算s
思路:首先把符号也转换为正数n&n-1;每一次运算把最后的一位数变为0; int NumberOf1(int n) { n=unsigned (n); if(n==0) return 0; int counts=0; while(n) { ...原创 2018-05-21 15:40:24 · 109 阅读 · 0 评论 -
剑指offer 5 用栈实现队列
思路:压入的时候 也就是栈的压入; 弹出的时候,需要用到两个栈;stack<int>st1,st2;int pop(){ if(st2.empty()) 往栈2压入数据; else 弹出队列;}class Solution{public: void push(int node) { ...原创 2018-05-15 00:48:52 · 91 阅读 · 0 评论 -
剑指offer 4 二叉树的重建
条件 知道前序遍历和中序遍历;求出此二叉树; 函数原型为: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)思路:先考虑特殊情况 不合法输入的时候 或者只有一个结点的时候递归方法;求出根节点的左右子节点;递归出两个子函数 所以需要四个数组;前序遍历的 左右子树;中序遍历的左右子树数组 T...原创 2018-05-11 01:42:39 · 117 阅读 · 0 评论 -
第三 题 剑指offer 链表的逆序打印
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/class Solution {public: vector<int...原创 2018-05-10 01:00:21 · 95 阅读 · 0 评论 -
(三) 剑指offer 15、两个有序链表的合并
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Merge(ListNode* p1, ListNode* p2) { if(p1==...原创 2018-06-02 15:16:44 · 107 阅读 · 0 评论 -
(三)剑指offer 16 判断是不是子树
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: bool isSub(TreeNode* pRoot...原创 2018-06-02 16:11:15 · 150 阅读 · 0 评论 -
(三)剑指offer 27 数组中出现次数超过一半的数字
思路:1、最直观的一种方法就是:用快速排序的思想 找出位于中间位置的那个数;时间复杂度为 nlogn;然后就是再查找这个数的个数是不是大于总个数的一般;2、就是设置两个变量times=0;res=nums[0];如果说遇到的下一个数与res不同 则times--;class Solution {public: //方法一:times比较个数的巧方法; int MoreThanHa...原创 2018-07-05 11:20:22 · 122 阅读 · 0 评论 -
(三)剑指offer31 把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:1、将数组进行排序;排序的规则就是 两个数字组成的字符串按照从小到大的方式排序,也就是 sort调用的必须是静态函数;static bool cmp(int a,int b) ...原创 2018-07-17 11:59:20 · 129 阅读 · 0 评论 -
(三)剑指offer 从1到整数n的当中1出现的次数
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路:1、从低位往高位查找,i=1;从第一位开始;2、设置几个变量 high:表示第i位左边的数 也就是高...原创 2018-07-10 11:29:32 · 109 阅读 · 0 评论