大家好,我是编程熊. 往期文章介绍了<线性表>中的数组.链表.栈.队列,以及单调栈和滑动窗口. ACM金牌选手讲解LeetCode算法<线性表> ACM金牌选手讲解LeetCode算法<栈和队列的高级应用> 本期我们学习哈希,其主要作用是加速我们查找数据的速度. 文章将从以下几个方面展开,内容通俗易懂. 若不想了解哈希原理,直接使用哈希表刷题的话,可以直接下拉到"常见的哈希结构"部分. 哈希概述 哈希表又称散列表,表现形式为将任意长度的输入,通过哈希…
大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM金牌,保研985,<ACM金牌选手讲解LeetCode算法系列>作者. 上一篇文章讲解了<线性表>中的数组.链表.栈和队列的概念和基本应用,本文讲解栈和队列的高级应用. 单调栈 双端队列 滑动窗口 单调栈 介绍 单调栈 = 单调 + 栈,因此其同时满足两个特性: 单调性.栈的特点. 单调性: 单调栈里面所存放的数据是有序的(单调递增或递减). 栈: 后进先出. 因其满足单调性和每个数字只会入栈一次,所以可以在时间复杂…
哈喽,大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM亚洲区域赛金牌,保研985研究生,分享算法与数据结构.计算机学习经验,帮助大家进大厂~ 公众号:『编程熊』 文章首发于: ACM金牌选手算法讲解<线性表>!戳这里! 线性表 LeetCode刷题过程中,常常用到的线性表主要包括以下四个重要的数据结构: 数组.链表.栈.队列. 下面将分别讲解数组.链表.栈和队列. 线性表概述 线性: 这里的线性是逻辑上的连续,而非物理存储的连续. 存储的数据: 线性表是一个有n个相同类型数据…
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑选的LeetCode题单,并根据题目知识点的类型分好了类别,大家可以根据每个知识点,进行有针对性的刷题. 数据结构 数组&双指针 LeetCode 1. 两数之和 LeetCode 4. 寻找两个正序数组的中位数 LeetCode 15. 三数之和 LeetCode 75. 颜色分类 LeetCod…
大家好,我是编程熊. 往期我们一起学习了<线性表>相关知识. 本期我们一起学习二叉树,二叉树的问题,大多以递归为基础,根据题目的要求,在递归过程中记录关键信息,进而解决问题. 如果还未学习递归的同学,编程熊后续会讲解递归,建议学习递归后再来做二叉树相关题目,但并不影响学习二叉树基础知识部分. 本文将从以下几个方面展开,学习完可以解决面试常见的二叉树问题. 二叉树概述和定义 顾名思义,二叉树的每个节点最多有两个子节点,下图展示了常见的二叉树. 二叉树的定义方式 二叉树是由许多节点组成,节点有数据…
这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体而言,你的设计应包括以下功能: put(key,value):将一个(key,value)对插入HashMap.如果该值已存在于HashMap中,请更新该值. get(key):返回指定键映射到的值,如果此映射不包含键的映射,则返回-1. remove(key):如果此映射包含键的映射,则删除值键的…
这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含以下功能: add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中是否存在这个值. remove(value):将给定值从哈希集合中删除.如果哈希集合中没有这个值,什么也不做. 例如: MyHashSet hashSet = new MyHashSet();…
这是悦乐书的第248次更新,第261篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第115题(顺位题号是506).根据N名运动员的得分,找到他们的相对等级和得分最高的三个人,他们将获得奖牌:"金牌","银牌"和"铜牌".例如: 输入:[5,4,3,2,1] 输出:["Gold Medal","Silver Medal","Bronze Medal",&quo…
这是悦乐书的第176次更新,第178篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第35题(顺位题号是141).给定一个链表,确定它是否有一个循环. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 理解题意 什么样结构的链表才算是拥有一个循环呢? 链表中某一节点的引用指向了当前链表中已经存在的另一节点时,此链表存在循环. ListNode L = new ListNode(1); Li…
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. Example: Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6. Follow up:…
近日LeetCode算法 前言:最近刷了好多leetcode算法题,大家知道,程序=数据结构+算法,由此可见,算法真的是很重要的呢.闲话少谈,切入正题,来看看小编觉得有点意思的5题算法题吧... 1. LeetCode 73:矩阵置零 难度等级:中等 题目 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0. 示例 解题思路 这是一个二维数组,我们只需要遍历一遍这个二维数组,把元素为0的那个位置所在的行与列分别标记起来,可以放在一个HashSet中,我们都知道…
一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想后的优化. 所以本文重点是讲解KMP算法的核心,文章最后会有涉及一些改良过程. 二.KMP算法简介 KMP算法是字符串匹配算法的一种.它以三个发明者命名,Knuth-Morris-Pratt,起头的那个K就是著名科学家Donald Knuth. 三.KMP算法行走过程 首先我们先定义两个字符串作为示…
leetcode算法: Find Bottom Left Tree ValueGiven a binary tree, find the leftmost value in the last row of the tree.Example 1:Input: 2 / \ 1 3Output:1Example 2: Input: 1 / \ 2 3 / / \ 4 5 6 / 7Output:7Note: You may assume the tree (i.e., the given root n…
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com"这样的网站域名由各种子域组成.在顶级,我们有"com",在下一级,我们有"leetcode.com",在最低级别,"discuss.leetcode.com".当我们访问像"discuss.leetcode.com"这样…
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为100个单位,如果写一个字母会导致该行的宽度超过100个单位,则会写入下一行.给出一个数组宽度,一个数组,其中widths[0]是'a'的宽度,widths[1]是'b'的宽度,widths[25]是'z'的宽度. 现在回答两个问题:S中至少有一个字符有多少行,最后一行使用的宽度是多少?将答案作为长…
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系列点和短划线,如下所示:"a"映射到".-","b"映射到"-...","c"映射到"-.-.", 等等. 为方便起见,下面给出了英文字母26个字母的完整表格: [".-"…
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是796).给定两个字符串A和B,在A上进行移位操作,规则是将A最左边的字符移动到最右边去.例如,如果A ='abcde',那么在A上移位一次后,它将是'bcdea'.当且仅当A在A上移位一定次数后可以变为B时返回True.…
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的数,这样的数被称为好数字.数字中的每一位都必须经过旋转.旋转的规则是:0,1,8这三个数旋转后还是自身,2旋转后变为5,5旋转后变为2,6旋转后变为9,9旋转后变为6,剩下的3,4,7旋转后并不能转成其他数字,是无效的.现在给出正数N,从1到N的好数字一共有多少个?例如: 输入:10 输出:4 说明…
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另一个字符串.返回可以创建的所有可能字符串的数组.例如: 输入:S ="a1b2" 输出:["a1b2","A1b2","a1B2","A1B2"] 输入:S ="3z4" 输出:["…
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个不同节点的值之间的最小差值.示例: 给定的树[4,2,6,1,3,null,null]由下图表示: 4 / \ 2 6 / \ 1 3 输出:1 说明:请注意,root是TreeNode对象,而不是数组.该树中的任意节点最小差值为1,它发生在节点1和节点2之间,也发生在节点3和节点2之间. 注意:…
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是你拥有的一种石头.计算S中有多少石头也是珠宝.J中的字符不会重复出现,J和S中的所有字符都是英文字母.字母区分大小写,因此"a"被认为是与"A"不同类型的石头.例如: 输入:J ="aA",S ="aAAbbbb" 输出:3 输入…
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是Toeplitz.现在给定一个M×N矩阵,当且仅当矩阵是Toeplitz时返回True.例如: 输入:矩阵= [[1,2,3,4],[5,1,2,3],[9,5,1,2]] 输出:true 说明:在上面的网格中,对角线是:"[9]","[5,5]","[1,1…
这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的二进制数中1的个数,判断1的个数是否是一个素数.例如,21的二进制数是10101,其中1的个数有3个,3是一个素数.例如: 输入:L = 6,R = 10 输出:4 说明: 6 --> 110(2个1,2是素数) 7 --> 111(3个1,3是素数) 9 --> 1001(2个1,2是素数…
这是悦乐书的第281次更新,第298篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第149题(顺位题号是657).在2D平面上有一个从位置(0,0)开始的机器人.给定其移动序列,判断该机器人在完成移动后是否在(0,0)处结束.移动序列由字符串表示,字符move [i]表示其第i个移动.有效移动是R(右),L(左),U(上)和D(下).如果机器人在完成所有移动后返回原点,则返回true.否则,返回false. 注意:机器人的"朝向"无关紧要. "R…
这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在每次移动中,您可以向左或向右移动.在第n次移动(从1开始)期间,你可以走n步.返回到达目的地所需的最少步骤数.例如: 输入:target = 3 输出:2 说明:在第一步中,我们从0步进到1.在第二步,我们从1步骤到3. 输入:target = 2 输出:3 说明:在第一步中,我们从0步进到1.在第…
这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串licensePlate中的所有字母.据说这样的单词可以完成给定的字符串licensePlate.在这里,对于字母我们忽略大小写.例如,licensePlate上的"P"仍与单词上的"p"匹配.答案肯定存在.如果有多个答案,则返回数组中首先出现的答案.licensePlate…
这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大元素是否至少是数组中每个其他数字的两倍.如果是,则返回最大元素的索引,否则返回-1.例如: 输入:nums = [3,6,1,0] 输出:1 说明:6是最大的整数,对于数组x中的每个其他数字,6是x的两倍多. 值6的索引是1,所以我们返回1. 输入:nums = [1,2,3,4] 输出:-1 说明…
这是悦乐书的第307次更新,第327篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第176题(顺位题号是746).在楼梯上,第i步有一些非负成本成本[i]分配(0索引).一旦支付了费用,您可以爬一到两步.您需要找到到达楼层顶部的最低成本,您可以从索引为0的步骤开始,也可以从索引为1的步骤开始.例如: 输入:cost= [10,15,20] 输出:15 说明:最便宜的是从成本[1]开始,支付该成本并返回顶部. 输入:cost= [1,100,1,1,1,100,1,1…
这是悦乐书的第306次更新,第326篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第175题(顺位题号是744).给定一个仅包含小写字母的有序字符数组,并给定目标字母目标,找到数组中大于给定目标字符的最小元素.例如,如果目标是target ='z'并且letters = ['a','b'],则答案是'a'.例如: 输入:letters = ["c","f","j"],target ="a" 输出:…
这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到65535).给定表示泛洪填充的起始像素(行和列)的坐标(sr,sc)和像素值newColor,进行"泛洪填充"图像. 要执行"泛洪填充",请考虑起始像素,以及与起始像素相同颜色的起始像素4向连接的任何像素,以及与这些像素4向相连的任何像素(也使用与起始像素),依此类推…