算法与数据结构
SanfordZhu
从现在开始,就是最好的时间。
展开
-
C++ 算法之递归问题总结
斐波那契数列:n=0,f(n)=0,n=1,f(n)=1f(n) = f(n-1) + f(n-2) 递归解法:int Fibonacci(int n) { if(n <= 1) { return n; } else { return Fi...原创 2018-09-21 00:14:18 · 2386 阅读 · 0 评论 -
leetcode 6 Z字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行Z 字形排列。比如输入字符串为 "LEETCODEISHIRING"行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定行数变换的函数:...原创 2019-06-08 22:50:01 · 253 阅读 · 0 评论 -
leetcode 14 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"]输出: "fl"示例2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母a-z。解题思路:将第一个字符串的每一位与剩余...原创 2019-06-03 13:04:44 · 198 阅读 · 0 评论 -
leetcode 28 实现strStr()--字符串匹配
实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needl...原创 2019-06-03 13:49:18 · 314 阅读 · 0 评论 -
leetcode 443 压缩字符串
给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。进阶:你能否仅使用O(1) 空间解决问题?示例 1:输入:["a","a","b","b","c","c","c"]输出:返回6,输入数组的前6个字符应该是:["a"...原创 2019-06-03 15:50:32 · 264 阅读 · 0 评论 -
leetcode 925 长按输入
你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回True。示例 1:输入:name = "alex", typed = "aaleex"输出:true解释:'alex' 中的 'a' 和 'e' ...原创 2019-06-20 00:10:38 · 249 阅读 · 0 评论 -
leetcode 594 最长和谐子序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。示例 1:输入: [1,3,2,2,5,2,3,7]输出: 5原因: 最长的和谐数组是:[3,2,2,2,3].说明: 输入的数组长度最大不超过20,000.解题思路:用O(n)时间复杂度来实现,首先遍历一次数组,用map记录数字和出现的...原创 2019-06-20 12:25:36 · 258 阅读 · 0 评论 -
leetcode 459 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。示例 2:输入: "aba"输出: False示例 3:输入: "abcabcabcabc"输出: True解释: 可由子字符串 "abc" 重复...原创 2019-06-20 12:43:59 · 246 阅读 · 0 评论 -
leetcode 2 两数之和
给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -&...原创 2019-06-21 13:53:03 · 226 阅读 · 0 评论 -
leetcode 696 计数二进制子串
给定一个字符串s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。示例 1 :输入: "00110011"输出: 6解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。请注意,一些重复出现的子串要计算它们出现的次数。...原创 2019-06-17 21:57:54 · 229 阅读 · 0 评论 -
leetcode 3 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"w...原创 2019-07-03 00:08:25 · 200 阅读 · 0 评论 -
C++ 实现字符串压缩
字符串压缩:#include <iostream>using namespace std;string myZIP(string str);string myZIP(string str){ string zip; //"aaaabbndaa"压缩后a4b2nda2 int n = 1; for(int i=0;i<str.length(...原创 2018-09-14 14:10:57 · 8514 阅读 · 3 评论 -
leetcode 54 59 螺旋矩阵I和II
给定一个包含m x n个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]]输出: ...原创 2019-07-05 00:25:21 · 265 阅读 · 0 评论 -
leetcode 62 63 不同路径I和II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m和 n 的值均不超过 100。示例1:输入: m = 3, n = 2输出: 3解释:从...原创 2019-07-05 13:43:14 · 288 阅读 · 0 评论 -
leetcode 78 子集
给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]class Solution {public: vector<vector...原创 2019-07-05 14:59:45 · 239 阅读 · 0 评论 -
leetcode 90 子集II
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[ [2], [1], [1,2,2], [2,2], [1,2], []]解题思路:我们看到第 4 行黑色的部分,重复了,是怎么造成的呢?第 4 行新添加的 2 要加到第 3 行的所有...原创 2019-07-06 15:49:28 · 226 阅读 · 0 评论 -
leetcode 784 字母大小写全排列
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。示例:输入: S = "a1b2"输出: ["a1b2", "a1B2", "A1b2", "A1B2"]输入: S = "3z4"输出: ["3z4", "3Z4"]输入: S = "12345"输出: ["12345"]注意:S的长度不超过12。S仅...原创 2019-07-06 16:15:41 · 259 阅读 · 0 评论 -
leetcode 1 两数之和
给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]//哈希表...原创 2019-06-08 16:32:13 · 216 阅读 · 0 评论 -
leetcode 反转链表I、反转链表 II
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?解题思路:在遍历列表时,将当前节点的next指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用...原创 2019-06-02 17:06:40 · 259 阅读 · 0 评论 -
leetcode 347 前K个高频元素
给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ,n是数组的大小。...原创 2019-06-07 17:43:17 · 205 阅读 · 0 评论 -
二叉树三种遍历(前序,中序,后序)的递归与非递归C++实现
二叉树的前序遍历(递归实现):class Solution {public: vector<int> res; vector<int> preorderTraversal(TreeNode* root) { if(root!=NULL){ res.push_back(root->val); ...原创 2019-05-08 12:50:07 · 3416 阅读 · 1 评论 -
leetcode 用栈实现队列/用队列实现栈C++
使用队列实现栈的下列操作:push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back,peek/pop from front,size, 和is empty这些操作是合法的。 你所使用的语言也许不支持队列。你可以使用 lis...原创 2019-05-14 21:44:15 · 1602 阅读 · 0 评论 -
leetcode20 有效的括号
给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false...原创 2019-05-27 13:49:08 · 993 阅读 · 0 评论 -
leetcode88 合并两个有序数组
给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存nums2中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2...原创 2019-05-27 15:25:53 · 213 阅读 · 0 评论 -
leetcode 830 较大分组的位置
在一个由小写字母构成的字符串S中,包含由一些连续的相同字符所构成的分组。例如,在字符串S = "abbxxxxzyy"中,就含有"a","bb","xxxx","z"和"yy"这样的一些分组。我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。最终结果按照字典顺序输出。示例1:输入: "abbxxxxzzy"输出...原创 2019-05-30 14:54:25 · 221 阅读 · 0 评论 -
leetcode 989 整数形式的整数加法
对于非负整数X而言,X的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果X = 1231,那么其数组形式为[1,2,3,1]。给定非负整数X的数组形式A,返回整数X+K的数组形式。示例 1:输入:A = [1,2,0,0], K = 34输出:[1,2,3,4]解释:1200 + 34 = 1234解释 2:输入:A = [2,7,4],...原创 2019-05-30 15:57:41 · 295 阅读 · 0 评论 -
6种经典排序算法总结(冒泡,选择,插入,归并,快排,堆排)
为什么要学习复杂度为O(N^2)的排序算法?1.基础,编码简单,易于实现,是一些简单情景的首选2.在一些特殊情况下,简单的排序算法更有效(插入)3.简单排序算法的思想衍生出的其他排序方式4.作为子过程,改进更复杂的排序算法冒泡排序思想:每次迭代通过比较相邻两个元素的大小,进行元素位置的调整,直到所有元素全部排好,代码如下void bubbleSort (int ...原创 2019-05-19 15:52:46 · 1664 阅读 · 0 评论 -
leetcode 674 最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续的的递增序列。示例 1:输入: [1,3,5,4,7]输出: 3解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。 示例 2:输入: [2,2,2,2,2]输出: 1解释: 最长连续递增序列是 [2], 长度为1。注意:数...原创 2019-05-30 16:40:57 · 219 阅读 · 0 评论 -
leetcode 724 寻找数组的中心索引
给定一个整数类型的数组nums,请编写一个能够返回数组“中心索引”的方法。我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。示例 1:输入: nums = [1, 7, 3, 6, 5, 6]输出: 3解释: 索引3 (nu...原创 2019-05-30 21:28:47 · 251 阅读 · 0 评论 -
leetcode 位运算小结
leetcode 136 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4解题思路:异或的计算性质:2 ^ 3 ^ 2 ^...原创 2019-05-24 16:29:42 · 1481 阅读 · 0 评论 -
leetcode 189 旋转数组
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4]解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]示例2:输入: [-1,-100,3,99...原创 2019-05-28 15:23:47 · 249 阅读 · 0 评论 -
C++ 实现图片平滑器及矩阵reshape
平滑器在图像处理领域应用较为广泛,可以用来进行去躁操作,灰度值平滑等。其衍生出来的思想还用于卷积神经网络中的卷积核,实现特征的提取和数据的降维。下面是leetcode 661 图片平滑器:leetcode 661图片平滑器包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度(向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果...原创 2019-05-28 16:14:49 · 2293 阅读 · 0 评论 -
C++ 实现LRU缓存机制
对于开发者而言,缓存的接触必不可少,无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问,同时也可以降低服务器的负载和压力。那么,了解常见的缓存淘汰算法的策略和原理就显得特别重要。常见的缓存算法:LRU (Least recently used) 最近最少使...原创 2019-05-31 15:25:43 · 2977 阅读 · 0 评论 -
leetcode 849 到最近的人的最大距离
在一排座位(seats)中,1代表有人坐在座位上,0代表座位上是空的。至少有一个空座位,且至少有一人坐在座位上。亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。返回他到离他最近的人的最大距离。示例 1:输入:[1,0,0,0,1,0,1]输出:2解释:如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。如果亚...原创 2019-05-31 18:59:06 · 205 阅读 · 0 评论 -
leetcode 532 数组中的K-diff数对
给定一个整数数组和一个整数k, 你需要在数组里找到不同的k-diff 数对。这里将k-diff数对定义为一个整数对 (i, j), 其中i和j都是数组中的数字,且两数之差的绝对值是k.示例 1:输入: [3, 1, 4, 1, 5], k = 2输出: 2解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。尽管数组中有两个1,但我们只应返...原创 2019-05-31 21:34:13 · 278 阅读 · 0 评论 -
leetcode 697 数组的度
给定一个非空且只包含非负数的整数数组nums, 数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是找到与nums拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入: [1, 2, 2, 3, 1]输出: 2解释: 输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, ...原创 2019-05-29 21:35:47 · 291 阅读 · 0 评论 -
美团笔试--区间统计
基本思想:Map+窗口#include<iostream>#include<vector>#include<cmath>#include<cstring>#include<map>using namespace std;int main(){ int n,k,t;cin>>n>&g...原创 2018-09-10 16:00:09 · 1124 阅读 · 0 评论