数据结构与算法
分享一些经典常用的数据结构算法题目,
主要来源于leetcode,剑指offer
SS_zico
一起学习~~~
展开
-
归并/堆排/快排/二分---C++实现
#include <iostream>#include <algorithm>#include <vector>#include <map>#include <set>#include <string>#include <list>using namespace std;int binSearch(vector<int>arr,int start,int end,int key){ int原创 2021-07-07 10:22:43 · 455 阅读 · 0 评论 -
判断链表是否有环--递归
判断链表是否有环方法一:定义快慢指针,两指针相遇则为有环方法二:递归异常判断当节点的下一个等于节点则有环返回真让下一个节点指向前一个看下一个节点class Solution {public: bool hasCycle(ListNode *head) { if(!head || !head->next)return false; if(head->next == head) return true; ListNode *原创 2021-05-28 18:01:25 · 384 阅读 · 0 评论 -
最小的K个数
最小的K个数描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组示例1输入:[4,5,1,6,2,7,3,8],4返回值:[1,2,3,4]采用快排的思想对数组[l, r]一次快排partition过程可得到:[l, p)p[p+1, r)三个区间,[l,p)为小于等于p的值[p+1,r)为大于等于p的值。然后再判断p,利用二分法如果[l,p), p原创 2021-05-28 15:34:40 · 209 阅读 · 0 评论 -
摩尔投票法
摩尔投票法(Boyer–Moore majority vote algorithm)出自论文《MJRTYA Fast Ma jorityVote Algorithm》算法解决的问题是如何在任意多的候选人(选票无序),选出获得票数最多的那个。常见的算法是扫描一遍选票,对每个候选人进行统计的选票进行统计。当候选人的数目固定时,这个常见算法的时间复杂度为:O ( n ) ,当候选人的数目不定时,统计选票可能会执行较长时间,可能需运行O ( n 2 ))的时间。当选票有序时,可以很容易编出O ( n ) 的原创 2021-04-25 11:48:42 · 776 阅读 · 0 评论 -
力扣461.汉明距离
汉明距离在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。布赖恩·克尼根算法class Solution: def hammingDistance(self, x, y): xor = x ^ y distance = 0 while xor: distance += 1 # remove the .原创 2021-04-25 11:19:59 · 205 阅读 · 0 评论 -
剑指offer 58.对称的二叉树
对称的二叉树题目:输入一颗二叉树,判断是否对称(镜像)题解:递归1.设置一个递归函数isSame(r1, r2),表示如果对称,返回true,否则返回false2.递归终止条件:r1nullptr && r2nulllptr, 直接返回true,否则,如果只有一个为nullptr,返回false3.下一步递归:如果r1->val == r2->val, 则isSame(root1->left, root2->right) && isSame(原创 2021-03-19 15:39:49 · 190 阅读 · 0 评论 -
力扣160. 相交链表
相交链表编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B.原创 2021-03-16 19:05:35 · 208 阅读 · 0 评论 -
力扣141.环形链表
141. 环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,2原创 2021-03-16 18:27:09 · 217 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
力扣 79请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第原创 2021-02-04 15:26:33 · 250 阅读 · 0 评论 -
力扣239. 滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1原创 2021-02-04 14:53:29 · 716 阅读 · 0 评论 -
力扣295. 数据流的中位数
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)addNum(2)findMedian() -> 1.5addNum(3)findMedian()原创 2021-02-04 14:50:54 · 493 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树
力扣: 297牛客:JZ61请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 “[1,2,3,null,null,4,5]”/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2021-02-04 14:38:15 · 187 阅读 · 0 评论 -
JZ59.按之字型顺序打印二叉树
牛客:JZ59题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。示例1输入{8,6,10,5,7,9,11}返回值[[8],[10,6],[5,7,9,11]]class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<in原创 2021-02-04 14:30:59 · 179 阅读 · 0 评论 -
力扣102. 二叉树的层序遍历
NC80 bfs给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2021-02-04 14:22:19 · 176 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1原创 2021-02-04 13:52:09 · 185 阅读 · 0 评论 -
剑指Offer 57. 二叉树的下一个节点
牛客 :JZ57给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析二叉树的下一个节点,一共有以下情况:1.二叉树为空,则返回空;2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。代码如下:class Solution {pu原创 2021-02-03 20:57:35 · 194 阅读 · 0 评论 -
剑指Offer 56. 删除链表的重复节点
题目如下:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3解题方法11、为了考虑特殊情况,比如1->1-> 2-> 3 这种情况,第一个节点会被删除,所以我们需引入一个哑节点nodenode->next = hea原创 2021-02-03 20:45:08 · 218 阅读 · 0 评论 -
力扣142. 环形链表 II
链表中环的入口节点方法一:哈希表方法二:快慢指针给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?方法一:哈希表思路与算法一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来原创 2021-02-03 20:36:28 · 298 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "class Solution {public: char firstUniqChar(string s) { unordered_map<char, int> t; for(char c: s) t[c]++; //统计个数 for(char c: s)原创 2021-02-03 20:16:24 · 179 阅读 · 0 评论 -
剑指Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。class Solution {public: bool isNumber(string s) { int n = s.size(); int index = -1; bool hasDot =原创 2021-02-03 20:07:34 · 174 阅读 · 1 评论 -
剑指Offer 66.构建乘积数组
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 100000要求一个数组其他数的乘积。就等于这个数的左边×右边,左右各维护一个数组。结果就是左边原创 2021-02-03 19:48:22 · 154 阅读 · 0 评论 -
算法笔记--栈
栈有效的括号有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true...原创 2021-01-29 18:23:35 · 260 阅读 · 0 评论 -
算法笔记
算法笔记程序有算法和数据结构组成,它们是不一样的,算法,是解决问题得方法。而算法的实现,往往需要一些数据,所以算法也离不开数据结构得铺垫。常见得算法有:二分、分治、递归、贪心、动态规划等数据结构有:数组、链表,二叉树、图等看到一个题的第一想法是看hash思想能不能用到,二分思想能不能用到,通常能确定中间指针走向的都是二分,这个题是不是适用于贪心算法,如果贪心算法解决不了,那么是什么原因导致贪心解决不了,是不是之后的某一步结果受限于之前的某一步,这样就再去考虑动态规划,是不是背包问题(常见01,完全原创 2021-01-29 17:59:44 · 208 阅读 · 0 评论 -
算法笔记--贪心
贪心贪心算法买卖股票的最佳时机分糖果 (hard难度贪心)方法1:遍历两次 满足左规则和右规则方法2 :遍历一遍贪心判断子序列模拟行走机器人(leetcode#874)贪心算法贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题原创 2021-01-31 12:26:06 · 285 阅读 · 0 评论 -
算法笔记--排序
排序力扣56.合并区间力扣75.颜色分类力扣147. 对链表进行插入排序力扣242. 有效的字母异位词力扣349.两个数的交集排序算法为基础算法,很多算法都是利用了排序的思想,如小和问题和逆序对问题就是用到了归并思想,topk问题用到了堆排思想等等,所以排序算法一定要烂熟于心。排序算法题主要为数组排序和链表排序,难度相对较低,大家可以在leetcode中练习,如leetcode #56,#75,#147,#148,#242,#349,#350,#922,#969,#973,#976。力扣56.合并区间原创 2021-01-31 12:12:34 · 245 阅读 · 0 评论 -
算法笔记--堆
堆典型例题前K个高频元素有序矩阵中第k小的元素堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构。堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:• 堆中某个节点的值总是不大于或不小于其父节点的值;• 堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅原创 2021-01-29 18:56:43 · 226 阅读 · 1 评论 -
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 ta原创 2021-01-11 17:34:29 · 144 阅读 · 0 评论 -
剑指Offer 03.数组中重复的数字
找出数组中重复的数字在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3根据数组下标遍历数组数字不等于下标 进入循环2.1 定义一个变量m记录第i个变量如果第m个数字等于m 则返回m否则 第i个数字与第m个数字进行交换数组遍历结束无重复 返回-1C++代码如下:原创 2021-01-11 17:10:13 · 189 阅读 · 0 评论 -
力扣 136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例输入: [4,1,2,1,2]输出: 4法一:哈希表时间复杂度O(n)空间复杂度O(n)法二:set时间复杂度O(n)空间复杂度O(n)法三:异或二进制中两数相同得0两数不同得1a^a = 0 (a可以时任何数)0^a = a (0异或任何值得到的结果是他本身)XOR异或满足交换率结合律代码如下:原创 2021-01-15 01:50:20 · 174 阅读 · 0 评论 -
力扣198.打家劫舍
输入:[1,2,3,1]输出:4偷窃第 k 间房屋,那么就不能偷窃第 k-1间房屋,偷窃总金额为前 k-2间房屋的最高总金额与第 kk 间房屋的金额之和。不偷窃第 kk间房屋,偷窃总金额为前 k-1 间房屋的最高总金额。时间复杂度:O(n)。空间复杂度:O(1)。...原创 2021-01-29 00:58:02 · 334 阅读 · 0 评论 -
力扣13. 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况原创 2021-01-15 02:18:29 · 249 阅读 · 1 评论 -
力扣121.买股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。法一 :暴力两边循环找最大差值时间复杂度O(n^2)class Solution {public: int maxProfit(vector<int>& prices) { int ans = 0; for(int i = 0;i<pr原创 2021-01-15 00:56:04 · 166 阅读 · 0 评论 -
力扣21.合并两个有序链表
合并两个有序链表法一:遍历两个链表法二:递归输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列法一:遍历两个链表定义哑变量,指向链表的前一个结点;定义前置节点指向前一个节点当两个链表都不为空时,遍历;当L1里的值小于L2里的值前置节点指向L1否则前置节点指向L2;前置节点偏移判断当一个链表为空时,前置原创 2021-01-13 12:25:27 · 171 阅读 · 0 评论 -
力扣 8.字符串转整数(atoi)
atoi字符串转整数字符串转整数空格处理正负号处理读入数字 res = res*10 + num;(注意溢出)INT_MAX逆操作原创 2021-01-13 00:45:42 · 184 阅读 · 0 评论 -
力扣 70.爬楼梯
爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶...原创 2021-01-12 23:58:15 · 252 阅读 · 0 评论 -
力扣 2.两数相加
两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输出:[8,9,9,9,0,0,0,1]解定义链表的头尾=原创 2021-01-12 22:34:42 · 204 阅读 · 0 评论