C++
shower_v
慢慢进步的小菜鸟
展开
-
牛客网_剑指offer_二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路找到该树的中序遍历的序列,就是一个排序好的序列了,然后将这个排序好的序列的左右节点相互连起来就好了。中点是要理解中序遍历这个概念,做好了中序遍历之后就十分简单了。具体代码如下:/*struct TreeNode { int val; struct Tre...原创 2019-05-07 22:34:36 · 142 阅读 · 0 评论 -
牛客网_剑指offer_顺时针打印矩阵_c++
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.解题思路这道题目的思路还是比较简单的,设置四个方位,上下左右,分别为top,buttom,left,right,然后...原创 2019-05-05 21:27:38 · 106 阅读 · 0 评论 -
牛客网_剑指offer_链表中倒数第k个结点_c++
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路利用前后指针的方法,第一个指针first先往前推移k步,第二个指针second放在开头,两者之间相差k步,然后同时向前推移,当first指针到达末尾的时候,可以根据second找到倒数第k个指针。具体代码如下:/*struct ListNode { int val; struct ListNode *next; ListN...原创 2019-04-25 14:54:26 · 131 阅读 · 0 评论 -
牛客网_剑指offer_调整数组顺序使奇数位于偶数前面_c++
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路思路1:1.一个十分投机取巧的方式是,用一个新的vector按顺序放进去,然后对应的一一赋值即可,具体的时间复杂度为O(n),空间复杂度也是O(n),具体代码如下:class Solution {pub...原创 2019-05-05 22:39:13 · 117 阅读 · 0 评论 -
牛客网_剑指offer_字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路如果字符串长度为len,则分len步去做,第n步的作用为找到所有的前n步的可能的情况,也就是说,假设len为4,则第一步...原创 2019-05-08 14:52:46 · 128 阅读 · 0 评论 -
牛客网_剑指offer_数值的整数次方_c++
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路题目十分简单,只需要对应指数的三种情况分别求解即可,具体情况的解析放在注释当中了,简单易懂。具体代码如下:class Solution {public: double Power(double base, int exponent) { ...原创 2019-04-25 13:33:40 · 143 阅读 · 0 评论 -
牛客网_剑指offer_二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路由于是考虑二进制中1的个数,直接用一个无符号整形数字,从1开始左移,做一个遍历即可。具体代码如下:class Solution {public: int NumberOf1(int n) { //负数用补码表示 //负数补码:第一位表示符号,负数...原创 2019-04-25 12:48:11 · 470 阅读 · 0 评论 -
牛客网_剑指offer_矩形覆盖_c++
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:这道题目其实本质上就是斐波那契数列,具体分析如下:首先,对于n=1的时候,只有一种情况;其次,对于n=2的时候,一共有两种情况,两个都是竖着或者两个都是横着;最后分析递归式,由于到达n的方式有两种,要么是前一个是竖着的小矩形,要么是前面是两个横着...原创 2019-04-25 12:19:42 · 158 阅读 · 0 评论 -
牛客网_剑指offer_二叉树的镜像_c++
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5解题思路:利用递归的思想,翻转左右子树即可,注意好边界情况,具体代码如下:/*struct TreeNode { int val; stru...原创 2019-05-03 12:20:23 · 113 阅读 · 0 评论 -
牛客网_剑指offer_合并两个排序的链表_c++
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路有点类似于归并排序的里面的一个基本操作,设置一个新的节点res,两个指针,分别指向两个输入,比较两个对应的val的大小来决定谁放到res的next里面去,考虑好边界情况即可解题。具体代码如下:1.递归版本:/*struct ListNode { int val; struc...原创 2019-05-02 22:25:45 · 127 阅读 · 0 评论 -
牛客网_剑指offer_反转链表_c++
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路设置两个ListNode的指针,first和second,在遍历的同时,使得second->next的值为first,然后注意处理下边界情况即可,具体代码如下:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x)...原创 2019-05-02 20:11:23 · 189 阅读 · 0 评论 -
剑指offer_牛客网_从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList解题思路:这个题目很简单,就直接用head = head->next来迭代即可,然后既然是从尾到头,就用vector的insert函数,在列表的最前面插入元素即可。/*** struct ListNode {* int val;* struct ListNode *next;* ...原创 2019-04-18 17:36:53 · 78 阅读 · 0 评论 -
牛客网_剑指offer_包含min函数的栈_c++
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))解题思路维持两个数据,一个用来按顺序存放push进来的数据,一个用来存放存进来的数据排序后的结果,对应的就可以返回在O(1)的情况下返回min的结果了(返回排序后的第一个值就是最小值)。具体代码如下:class Solution {private: vector<...原创 2019-05-05 21:53:16 · 173 阅读 · 0 评论 -
牛客网_剑指offer_栈的压入、弹出序列_c++
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路既然是考察是不是正确的弹出序列,那就模拟一遍真实操作即可,将pushV中的序...原创 2019-05-05 22:24:41 · 143 阅读 · 0 评论 -
牛客网_剑指offer_从上往下打印二叉树_c++
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路这道题的思路就是一层一层的处理,只需要定义一个临时的存放TreeNode*的vector即可,然后把root放进去,然后开始循环,把最前面的指针的左右节点push进来,把最前面节点的val给push进res中去,然后删去最前面的指针,一直到最终这个临时的vector为空为止,则完成了一次按顺序来的遍历。具体代码如下:/...原创 2019-05-05 22:38:26 · 222 阅读 · 0 评论 -
牛客网_剑指offer_复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路1.从旧的链表中创建新链表,本来是A->B->C变成了A->A’->B->B’->C->C’2.根据旧的链表的rando...原创 2019-05-07 22:10:11 · 83 阅读 · 0 评论 -
牛客网_剑指offer_重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路这是一道考察递归思想的编程题,首先,前序遍历的第一个元素一定是节点的值,然后对比中序遍历找到该节点的左子树和右子树,然后根据左子树和右子树对应...原创 2019-05-07 21:03:00 · 85 阅读 · 0 评论 -
牛客网_剑指offer_二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路对于这道题目,采用深度优先搜索即可找到对应的路径,不过需要将对应的path和res设置为一个全局变量。具体代码如下:/*struct TreeNode { int va...原创 2019-05-07 20:12:23 · 89 阅读 · 0 评论 -
牛客网_剑指offer_二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路首先默认大家知道什么是二叉搜索树的后序遍历,大概就是遍历一个树的时候,先遍历左节点,然后遍历右节点,最后输出根节点,不明白的可以百度一下查一下相关的例子就能够理解了,应该是还比较好理解的。那么怎么判断一个序列是不是二叉搜索树的后序遍历序列...原创 2019-05-07 18:42:18 · 101 阅读 · 0 评论 -
牛客网_剑指offer_整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路对于每一个数字,采取除10取余的方法可以得到1的个数,具体见下列代码...原创 2019-05-08 17:07:04 · 98 阅读 · 0 评论 -
牛客网_剑指offer_连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2019-05-08 16:40:53 · 404 阅读 · 0 评论 -
牛客网_剑指offer_最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路保持一个排序号的k个值的序列,遍历数组,当遍历的值小于序列的最后一个值的时候,就把这个数字插入进去,并且将最后的那个值弹出即可。具体代码如下:class Solution {public: vector<int> GetLeas...原创 2019-05-08 16:28:55 · 112 阅读 · 0 评论 -
牛客网_剑指offer_数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路解题思路分为两步;1.令count = 0;对数组进行遍历,当count=0的时候,tmp等于当前遍历的值,count++,当当前遍历的值等于tmp的时候,count...原创 2019-05-08 16:07:15 · 111 阅读 · 0 评论 -
LeetCode 最大子序和(C++)
时间复杂度为O(n)的解法代码如下:class Solution {public: int maxSubArray(vector<int>& nums) { int res = nums[0]; int sum = nums[0]; for (int i = 1; i < nums.size(); i...原创 2019-05-05 22:41:35 · 233 阅读 · 0 评论 -
LeetCode 数组中的第K个最大元素 (C++)
题目在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。解题思路:这里有一个十分简单的解...原创 2019-05-05 22:40:59 · 427 阅读 · 0 评论 -
leetcode_相交链表_c++
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* g...原创 2019-05-05 22:40:24 · 128 阅读 · 0 评论 -
剑指offer_牛客网_替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:1.看到这里的length是前面第一个参数,也就是那个字符数组的长度2.计算str的长度;3.计算str中的空格的数量,每多一个空格,新的字符串长度就要加2,计算得到新字符串长度4.如果新字符串长度大于length则直...原创 2019-04-18 17:20:09 · 111 阅读 · 0 评论 -
牛客网_剑指offer_变态跳台阶_c++
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:依旧还是递归的思路,找到对应的递归式十分重要,这里显然,可以由任意一阶到第n阶,则对应的递归式为:f(n) = f(0) + f(1) + f(2) + … + f(n-1)注意:由于可以从原始的位置直接跳到n阶,所以这里一定要注意有一个f(0) = 1具体...原创 2019-04-23 13:51:51 · 1195 阅读 · 0 评论 -
LeetCode 求众数 (C++)
题目给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2思路:这道题不能对于每一个数字都算一下数目然后最后得出谁最大然后得出众数,这样做会超出运行时间,所以采用一个map<in...原创 2019-04-02 15:50:02 · 547 阅读 · 0 评论 -
LeetCode 乘积最大子序列(C++)
题目给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。思路:由于nums[i]可能是正数,也肯能是负数,还可能是0,所以用一个递归的思路来解...原创 2019-04-02 15:38:00 · 586 阅读 · 0 评论 -
LeetCode 实现Trie(C++)
题目:实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 falsetrie.startsWith(“app...原创 2019-03-30 20:01:03 · 239 阅读 · 0 评论 -
LeetCode 单词拆分(C++)
这道题利用vector<bool>来做动态规划,变量名为tmp,tmp的第一个设置为true,从第一个开始遍历,从任何一个true开始,到任何一个地方结束,只要所包含的子串在wordDict里面,就将这个子串的尾部赋值为true,因此,如果tmp最后一个变量为true,则说明这个字符串可以被拆分,否则不行。class Solution {public: bool inDi...原创 2019-03-18 20:32:06 · 788 阅读 · 0 评论 -
C++ algorithm算法小结(一)
在c++的&amp;lt;algorithm&amp;gt;头文件中,有许多十分便利的算法,个人学习总结如下,方便以后复习。1.sort(iter1, iter2, comp)函数可以输入三个参数,前两个是RandomAccessIterator对象,限定了要排序的元素的范围,第三个元素是用于排序的函数,返回值必须是bool类型的值,函数的参数必须和需要排序的容器的里面的基本数据类型一样(默认为基本数据类型自...原创 2019-03-13 18:46:41 · 2449 阅读 · 0 评论 -
快速排序c++实现
快速排序是一个非常有名的排序方法,在实际应用过程当中被选用的概率特别高。这里的实现利用了递归的方法,快排的思想就是,做一次从第一个值到倒数第二个值的遍历,在每次把序列的最后一个当做参照,然后将小于这个值的数字与前面的值作替换,这里用到一个循环变量i,从0开始计数,也就是说循环完之后,前面的i个数字都比最后的这个参照数字小,然后将第i+1个数字与最后一个数字互换,这样,这个参照的数字就出现在了正确...原创 2019-03-21 20:01:18 · 199 阅读 · 0 评论 -
C++ algorithm算法小结(三)
今天继续带来一些常用的algorithm头文件中的算法的个人理解。一.find二.search三.replace四.remove原创 2019-03-19 18:35:15 · 283 阅读 · 0 评论 -
LeetCode 打家劫舍(C++)
直接用递归的话,由于递归的效率低,运行时间会不符合要求,所以用下面的迭代的方法,实际上还是递归的思想,不过用一个变量承载递归结果之后,大大提高了运行效率,代码如下:class Solution {public: int rob(vector<int>& nums) { if (nums.size() == 0) re...原创 2019-03-14 19:37:52 · 641 阅读 · 0 评论 -
LeetCode 买卖股票的最佳时机(C++)
这道题目的思路:用一个变量first表示所遇到的最小的数字,第二个变量res来表示所遇到的最大的差价(也就是最大利润),然后一直遍历过去,当遇到比first更小的数字的时候,将其赋值给first,当遇到更大的利润的时候,将其赋值给res,做一次循环即可,时间复杂度为O(n),空间复杂度为O(1),具体代码如下:class Solution {public: int maxProfi...原创 2019-03-14 16:53:14 · 845 阅读 · 2 评论 -
LeetCode 爬楼梯(C++)
这道题第一反应是可以用递归的思想,但是当n增大的时候,递归的效率会很让人抓狂,而且提交的时候会超出时间,无法通过。思路一是可以用一个vector<int>来解决这个问题,将每次前两者计算加和的结果push_back进去,最后返回这个vector的back()即可,代码如下:class Solution {public: int climbStairs(int n) ...原创 2019-03-14 16:42:43 · 936 阅读 · 0 评论 -
LeetCode 第一个错误版本(C++)
这道题很简单,采用二分类即可,具体代码如下:// Forward declaration of isBadVersion API.bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { if (n == 0) retu...原创 2019-03-14 16:15:17 · 184 阅读 · 0 评论 -
LeetCode 递增的三元子序列(C++)
题目给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。示例 1:输入: ...原创 2019-04-02 16:34:27 · 384 阅读 · 0 评论