leetcode刷题顺序(如何正确高效地使用LeetCode)
本文目录
- 如何正确高效地使用LeetCode
- 力扣刷题有意义吗
- LeetCode按照怎样的顺序来刷题比较好
- 备战秋招,leetcode每天刷多少题比较好
- leetcode算法
- 103. leetcode笔记(1~60)
- 耗时7天我终于把LeetCode刷通关:数组十七连,真是不简单
- leetcode什么水平才能刷
- leetcode plusone题目怎么通过
如何正确高效地使用LeetCode
正确高效地使用LeetCode可参考如下方法:
按Tag来刷,链表、二叉树、回溯、深度宽度优先遍历、图、贪心、动规、数组、哈希表……每个tag由easy到hard,每道题先自己思考,不会的参考了一个开源的解答或者参考Discuss或者博客。开始的时候自己独立思考的时间比较长,后来不会的题目就马上看解答。
一般题目解法有多种,这时候最好尝试一下其他的做法,至少要知道思路。比如有关图的题目就会有DFS和BFS两种解法。Discuss里一般都会有高质量的解答。
关键是每道题都要弄明白。一开始用IDE,跑出正确结果,再在线默写代码。后来写的多了,直接在线写代码了。这是一个自然的过程,做得多了就有“手感”了。
要想有效率的刷题就要对题目进行选择。就是说你不能每天看到什么题目就刷什么题目,而是要有计划地对题目进行先后排序。当时我刷题是在Lintcode上面进行的,就是先利用他的分类功能对题目进行类型分类,再根据难易进行排序,一段时间就专注在一种题目类型上。
然后根据自己的水平,从容易或者中等难度开始刷起,一点点增加难度值。这样子的话更容易对一种类型的题目进行掌握,刷题不管速度还是效率都会有所提高。
总结很重要
人是健忘的动物,如果你刷完题就把题目扔了,肯定没多久就忘得七七八八了,所以每做完一种类型的题目,甚至是做完一天的题目,就要参照标准答案对题目进行梳理整合总结,然后把这种总结记录下来,因为我用的Lintcode里面就有自带的笔记功能。
所以我当时就会每天直接在lintcode里面记录自己的总结结果,然后以后每隔一段时间就回顾一下,强化一下记忆,这样你刷过的题目才能真正为你所有,不会边刷边忘,效率低下。
最后就是一定要坚持刷,每天给自己强行安排指标,这样才能保证自己一直处在编程的状态下。这不但能养成编程刷题的习惯让刷题过程变得没那么痛苦,而且一直处在编程状态下本身就会让你的编程水平处在一个逐渐上升的过程中。
力扣刷题有意义吗
力扣刷题有意义,不仅可以熟能生巧,还可以见识到更多的新东西和不熟悉的,加强自己的印象和学习。
力扣(LeetCode)官网收录了许多互联网公司的算法题目,一度被称为刷题神器。这里我们就来介绍下如何使用力扣(LeetCode)网站。由于力扣(LeetCode)本身也处于不断迭代之后。因此本文部分内容有可能在将来会变得不再适用。
以力扣国际站为例,其官网给出了四个分类:Algorithms、Database、Shell和Concurrency,分别表示算法题、数据库题、Shell和并发题。
第一个就是我们所需要刷的算法题。并发是2019年才添加的新的模块。点开Algorithms后,我们可以看到一个题目的列表,每个题目都有一个唯一的序号。力扣(LeetCode)目前有1000多道题目。
并且一直持续更新,其中有一些是带锁的,需要会员才能查看。后面的接受率(Acceptance)表示提交的正确率,Difficulty表示难易程度。难易程度有三个级别,分别是Easy、Medium和Hard。
Easy通常不需要太多思考和也不会有复杂的细节,比较特别适合新手或者拿来热身。Medium级别就会有些难度,一般都会涉及到经典的算法,需要一定的思考。Hard级别是最难的,有些时候是算法本身的难度。
有些时候特别需要你考虑到各种细节。❝这里分享一个小技巧给大家。衡量一道题目难不难除了看难度之外,还可以看下接受率,接受率越低代表题目越难,这个指标有时候比难度更靠谱。❞你可以对题目进行筛选和排序。如果我们只想要找某一类型的题或者某个公司的题库,可以通过Tags或Company来筛选。
LeetCode按照怎样的顺序来刷题比较好
首先,如果你的时间特别紧,直接刷题当然没有问题。但我的经验是,如果你有相对宽裕的一些时间,除了想准备算法面试以外,还想真正把算法和数据结构的基础打扎实,应该先认真学习经典的算法和数据结构的底层原理。如果你的时间特别紧,可以直接跳到下面第二部分,“刷题篇”。
首先,这里面的很多内容,是刷题涉及不到的。比如在刷题的时候,基本不会遇到让你实现一个排序算法的情况,如果需要排序,通常是直接调用语言的标准库就好了。但是,我知道很多厂子的面试问题,恰恰就是“讲一讲快速排序是怎么回事儿,归并排序是怎么回事儿,红黑树的基本原理”。
等等这类问题。另一方面,其实对这些基础的算法和数据结构的学习,很多时候并不完全是学习一个算法这么简单,而蕴含着对算法思想的学习。我们可以看到,为了解决一个问题,我们可以如何设计算法。
最典型的例子就是递归。很多同学都觉得递归很绕。但是,在我列的这个列表中,所有的算法如果真的踏踏实实都搞明白了,我相信对递归是不怕的。无论是学习快速排序和归并排序,还是实现各种树结构中的基本操作。
都在不停地使用递归。我们在学习这些内容的时候,并非是简单的死记硬背,而是在看一些算法思想的具体应用。
备战秋招,leetcode每天刷多少题比较好
leetcode每天刷题不在量在质,要注意分tag来总结和积累,多做一些总结。
个人的素质与能力,是人员选聘时,要重点考虑的另一重要标准。应根据不同职位对人员素质的不同要求,来评价和选聘员工。如法约尔就提出作为主管人员,其个人素质应包括以下几个方面:
身体健康、精力旺盛、行动敏捷;智力、理解和学习的能力、判断力、记忆力、头脑灵活、思维敏捷、专注; 道德。有毅力、坚强、勇于负责任、有首创精神、忠诚、有自知之明、自尊。
智力与知识测试:该测试是通过考试的方法测评候选人的基本素质,它包括智力测试和知识测试两种基本形式。智力测试的目的是通过候选人对某些问题的回答。
测试他的思维能力、记忆能力、应变能力和观察分析复杂事物的能力等。知识测试是要了解候选人是否具备待聘职务所要求的基本技术知识和管理知识,缺乏这些基本知识,候选人将无法进行正常工作。
leetcode算法
*最近在做一些 leetcode 的算法题,我会将自己做过的算法题记录下来以供大家参考,如果查找不方便请看 油猴插件实现网站左侧目录生成。
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例:
解答:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例:
提示:
解答:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例:
说明:
解答:
给定一个整数数组,判断是否存在重复元素。 如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
示例:
解答:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例:
解答:
给定两个数组,编写一个函数来计算它们的交集。
示例:
说明:
进阶:
解答:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。
示例:
解答:
给定一个数组 nums ,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
说明:
给定一个整数数组 nums 和一个目标值 target ,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
解答:
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数独部分空格内已填入了数字,空白格用 ’.’ 表示。
示例:
说明:
解答:
给定一个 *n *× *n* 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。
说明: 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。 请不要 使用另一个矩阵来旋转图像。
示例:
解答:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char 的形式给出。 不要给另外的数组分配额外的空间,你必须 原地修改输入数组 、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例:
解答:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例:
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 。请根据这个假设,如果反转后整数溢出那么就返回 0。
解答:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
解答:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 长度一样,包含的字母都一样,每个字符出现的频率也一样,只是顺序不同而已,这就属于异位词,
示例:
说明: 你可以假设字符串只包含小写字母。
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解答:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明 :本题中,我们将空字符串定义为有效的回文串。
示例:
解答:
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
注意 :假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示 :
示例:
解答:
实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始) 。如果不存在,则返回 -1 。
示例:
说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符
解答:
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1 被读作 "one 1" ("一个一") , 即 11 。 11 被读作 "two 1s" ("两个一") , 即 21 。 21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211 。 给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意 :整数序列中的每一项将表示为一个字符串。
示例:
解答:
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 "" 。
示例:
说明: 所有输入只包含小写字母 a-z 。
解答:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 -- head = ,它可以表示为:
示例:
说明:
解答:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
说明: 给定的 n 保证是有效的。
进阶: 你能尝试使用一趟扫描实现吗?
解答:
反转一个单链表。
示例:
解答:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
解答:
请判断一个链表是否为回文链表。
示例:
解答:
给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1 ,则在该链表中没有环。
示例:
解答:
给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明 : 叶子节点是指没有子节点的节点。
示例: 给定二叉树 ,
返回它的最大深度 3 。
解答:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征:
示例:
解答:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 是对称的。
但是下面这个 则不是镜像对称的:
解答:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例: 二叉树: ,
返回其层次遍历结果:
解答:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例: 给定有序数组: , 一个可能的答案是: ,它可以表示下面这个高度平衡二叉搜索树:
解答:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
示例:
解答:
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 ,你想找出导致之后所有版本出错的第一个错误的版本。 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:
解答:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意 :给定 n 是一个正整数。
示例:
解答:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意 :你不能在买入股票前卖出股票。
示例:
解答:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
解答:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例:
解答:
打乱一个没有重复元素的数组。
示例:
解答:
设计一个支持 push , pop , top 操作,并能在常数时间内检索到最小元素的栈。
示例:
解答:
写一个程序,输出从 1 到 n 数字的字符串表示。
示例:
解答:
统计所有小于非负整数 n 的质数的数量。
示例:
解答:
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例:
解答:
罗马数字包含以下七种字符: I , V , X , L , C , D 和 M 。
例如,罗马数字 2 写做 II ,即为两个并列的 1 。 12 写做 XII ,即为 X + II 。 27 写做 XXVII , 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII ,而是 IV 。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX 。这个特殊的规则只适用于以下六种情况:
示例:
解答:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量 )。
示例:
提示:
103. leetcode笔记(1~60)
d1
***隐藏网址*** 给定 nums = , target = 9 因为 nums = 2 + 7 = 9 所以返回 【hashmap存储】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
nums1 = nums2 = 则中位数是 (2 + 3)/2 = 2.5 【奇偶判断】
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 【双循环贪心】
d2
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 输入: 121 输出: true 【折半比较】
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例: 输入: "abccccdd" 输出: 7 【集合更新与判空】(add remove, 放入可回文的字符,无重复)
给你一个字符串 s 和一个字符规律 p ,请你来实现一个支持 ’.’ 和 ’*’ 的正则表达式匹配。 ’.’ 匹配任意单个字符 ’*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 **整个 **字符串 s 的,而不是部分字符串。 说明:
【正则包与结果项】
d3
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例: 给定数组 nums = , 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 【新计数索引】
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例: 给定 nums = , val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 【while val存在】
实现 strStr() 函数: 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例: 输入: haystack = "hello", needle = "ll" 输出: 2
【str.index(p)】
d4
【分支递归乘数】
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 给定 nums = ,求和函数为 sumRange() sumRange(0, 2) -》 1 sumRange(2, 5) -》 -1 sumRange(0, 5) -》 -3 【缓存和】
给定一个二进制数组,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。 输入: 输出:4 解释:翻转第一个 0 可以得到最长的连续 1。 当翻转以后,最大连续 1 的个数为 4。 【最近0的出现位置】
d5
对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数” 输出: True 解释: 28 = 1 + 2 + 4 + 7 + 14 【折平根比较】
修改一个数,则变成非递减数列,输出True 【嵌套条件分支】
123456789101112...求出第N个数字对应的单字符数值 【while True中的数量级t和求解条件m】
d6
列表中存在最大长度为k的两个相等的数,则返True 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums , k = 3, 输出: true
【集合表示滑动窗口】
【双指针追踪】
两个数不是同一个数,存在某数2倍数的一个数则返回True 【判双零】
d7
两个数值型字符串,相加后返回结果字符串 【while中低位进位】
求节点与其祖先之间的最大差,如:
【左右递归dfs返回最大差】
一排人领糖果, 相邻的人rating高的获得较多糖,每人都有糖果。
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻的孩子中,评分高的孩子必须获得更多的糖果。 那么这样下来,老师至少需要准备多少颗糖果呢?如输入: , 输出: 5 解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
【左右规则】
d8
返回链表中倒数第k个节点值 【双指针追踪】
是否平衡二叉树,即任意一个节点其两颗子树的高度差不超过一。 【递归返回是否平衡和树高】
【三重while中低位进位】
d9
删除链表中的节点 【制造伪头结点】
之字形层次遍历二叉树,如:
【递归含层数的层次遍历与折返判断】
如果一个数的左边数组和与右边数组和相等,则返回此中间数的索引。 【从左累加与总和比较】
d10
输出二叉树的镜像, 如:
【制造临时节点的自身递归】
自底向上遍历二叉树,如:
【递归层次遍历】
【含hashmap的dfs递归】
d11
返回除法结果,不越界 【正负/零划分】
一个数的二进制表示中1的个数 【带奇偶判断的逐右移位】
移除所有值为val的节点,返回链表。如输入: 1-》2-》6-》3-》4-》5-》6, val = 6 输出: 1-》2-》3-》4-》5 【含有目标比较的自身递归】
d12
实现int sqrt(int x)函数 【牛顿迭代】
【两次判空与全存在的各自相加】
求出根到叶子节点路径总和为固定值的所有路径集
【目标递减下叶子和当前更新的路径和与目标值的比较】
d13
数组中是否有独一无二的出现次数 【hashmap计数与值数组判重】
给定一个无序的整数数组,找到其中最长上升子序列的长度。如输入: 输出: 4 ,解释: 最长的上升子序列是 ,它的长度是 4。
【双循环动态规划】
【递归判断】
d14
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。如输入: 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
【最低股价与最大利润同时更新】
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。如输入: nums = 输出: 6, 解释: 连续子数组 的和最大,为 6。
【max0 sum0初始索引0赋值,与sum0》0判断】
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。如输入: n = 12 输出: 3 ,解释: 12 = 4 + 4 + 4 【动态规划双循环解背包问题】
d15
统计所有小于非负整数 n 的质数的数量。如输入: 10 输出: 4,解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 【筛去法】
找出第 n 个丑数。 丑数就是只包含质因数 2, 3, 5 的正整数。如输入: n = 10 输出: 12, 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 【三指针动态规划】
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。如输入: prices = , fee = 2 输出: 8,解释: 能够达到的最大利润: 在此处买入 prices = 1 在此处卖出 prices = 8 在此处买入 prices = 4 在此处卖出 prices = 9 总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. 【买入卖出的动态规划】
d16
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 如输入: 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
【同leet714 多次买卖的动态规划】
是否是相同的树 【同空、不同空判断后的自身递归】
不特定根节点和叶子节点,返回路径总和为固定值的路径数 【自身递归与dfs递归】
d17
找出右边的值小于当前值的数的个数: 使用线段树构建左右子树,并从右到左计算前面的数小于当前值的数的个数,最终返回依次进入结果数组的list的倒置值。
【list复制法】 将遍历到的前两个和数都去掉,双重遍历T(n)= O(n)
规范的路径表示写法转换为最简路径 【栈进栈出,判断’’ ’.’ ’..’()】
d18
【复制字符库,逐次后移匹配库起始点】
按要求分一个数组为m份,求其中子数组的最大值中最小一个 【二分查找、设定子数组最大的和mid作划分节点】
【二分思想,拆分数组递归】(不用判断平衡)
d19(52%)
两个字符串对应位置移动总次数在指定步数内(ascii值的差),求字符串的最大可变换长 【滑窗记录更新最初位置、不断更新当前滑窗内移动步数最小值】
耗时7天我终于把LeetCode刷通关:数组十七连,真是不简单
大家好,我是老三,一个刷题困难户,接下来我们开始数组类型算法的刷题之旅!
数组
数组基本上是我们最熟悉的数据结构了,刚会写“Hello World”不久,接着就是“杨辉三角”之类的练习。
数组结构
上图是一个字符数组的例子。
因为内存空间连续,所以可以直接通过下标获取对应的元素。
但是删除就麻烦一点,相当于填坑,一个元素被移走,留下的坑,需要其它元素来填上。
删除元素
在Java中,多维数组的存储本质上也是一个行优先的一维数组。
我们都知道,在Java中的 “=” 用在基本数据类型上,是值传递,用在引用数据类型上,是引用传递。
这一块展开可以写一篇文章,我们只简单看个例子:
大家可以看到,newArray改变了,array也跟着变了。
为什么呢?
在Java中,数组是引用数组类型。array、newArray都是存储在栈中的引用,它们指向堆中真正存储的数组对象。
所以改变了newArray,实际是改变了newArray指向的数组。
数组引用传递
这一点是我们刷题需要注意的,复制数组需要在循环中一个个复制。
***隐藏网址***
难度:简单
描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
题目示例
思路:
二分查找可以说我们都很熟了。
因为数组是有序的,所以定义三个指针,low、high、mid,每次与中间指针指向的元素nums比较,
二分查找
但是这个代码还有一处问题,在哪呢?
int mid = (left + right) / 2;
这个地方可能会因为left和right数值太大导致内存溢出,所以应该写为 int mid = left + ((right - left) 》》 1);
修改之后代码如下:
时间复杂度:O(logn)
***隐藏网址***
难度:简单
描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
题目示例
思路:
二分查找比较简单,但写对还要费点功夫,再做一道基本一样的题巩固一下。
这道题基本一样,插入的位置可能有四种情况:
二叉树插入位置
代码如下:
时间复杂度:O(logn)
***隐藏网址***
难度:中等
描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 。
进阶:
题目示例
思路:
看到时间复杂度 O(log n) ,数组有序,我们知道,二分查找该上场了。
但是这道题有点不一样,它需要寻找边界。
那我们怎么办呢?
这就引入了寻找边界的二分查找。
这道题的思路是什么呢?
我们分别用二分查找来寻找左边界和右边界。
一般的二分查找:
注意,我们这里的返回条件是 nums == target ,但是寻找边界的时候就不能这样了,因为我们不能确定mid是不是我们的边界。
以寻找左边界为例,条件是 target 《= nums 的时候,我们接着往左移动。
寻找右边界也类似。
代码如下:
时间复杂度:O(logn)
***隐藏网址***
难度:简单
描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
思路
「暴力解法」
暴力解法没什么好说的,和上道题类似,找到要删除的元素,把它后面的元素全部向前移动一位。
暴力解法
这里有两点需要注意:
代码如下:
时间复杂度:O(n²)。
「双指针法」
双指针法,是数组和链表题中非常常用的一种方法。
这道题用双指针法怎么解决呢?
定义两个指针,一个前,一个后。没有找到目标的时候front和after一起移动,找到目标的时候,after停下来,front接着移动,把front指向的值赋给after指向的值。
这样一来,双指针就通过一个循环完成了双循环完成的事情。
双指针法
代码如下:
时间复杂度:O(n)。
***隐藏网址***
难度:简单
描述:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
题目示例
思路
趁着上一道题劲儿还没缓过来,赶紧做一道基本一样的巩固一下。
直接上代码:
时间复杂度:O(n)。
***隐藏网址***
难度:简单
描述:
给定一个数组 nums ,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
「示例:」
「说明」 :
思路
继续沿着上一道题的思路。
移动零
代码如下:
时间复杂度:O(n)。
***隐藏网址***
难度:简单
描述:
给你一个按 「非递减顺序」 排序的整数数组 nums ,返回 「每个数字的平方」 组成的新数组,要求也按 「非递减顺序」 排序。
题目示例
思路
「暴力排序法」
这道题一看,最直观的做法是什么呢?
先求数字平方的数组,然后再把新数组排序。
代码也好写:
时间复杂度:遍历时间复杂度O(n),快排时间复杂度O(nlogn),所以时间复杂度O(n+nlogn)。
思路
「双指针法」
我们连写几道双指针了,这道题能不能用双指针实现呢?
我们分析一下,这个数组在取平方之前,是有序的,那么它绝对值最大的数一定是在两端的。
所以我们可以定义两个指针,一个指向最左端,一个指向最右端,比较两者平方的大小,大的平方放入结果数组,并移动指针。
有序数组的平方
代码如下:
时间复杂度:O(n)。
***隐藏网址***
难度:简单
描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
题目示例
思路:
「暴力解法」
上来我们先来个最简单的暴力解法,大家应该都知道冒泡排序吧,类似的两层循环。
两层循环
代码写起来也很简单:
时间复杂度:看到这个双循环,就知道时间复杂度O(n²)。
「哈希辅助法」
时间复杂度O(n²)多少有点过了,这道题的重点是两个元素相加之和的判断。
我们可以用一个Hash集合把元素存起来,这样一来遍历一遍就够了,例如目标和9,当前元素2,只需要判断集合里是否有元素7就行了。
时间复杂度:从Hash查询和取值时间复杂度都是O(1),所以整体时间复杂度是O(1)。
***隐藏网址***
难度:简单
描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为0且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题目示例
思路:
「哈希法」
做完两数之和以后,我们首先想到的就是哈希法。
两层循环,取到a,b,再通过 0-(a+b) 来确定c。
但是这里还有一个问题, 答案中不可以包含重复的三元组。
所以,我们还要想办法去掉Hash里的重复元素。
可以加入一个约束,第三个数的索引大于第二个数才存入。
时间复杂度:双循环,O(n²)。
虽然这么也写出来了,但是,说实话,很难写出没有问题的代码。
我们写了这么多双指针,那么有没有可能用双指针的方式呢?
「双指针法」
首先对数组进行排序,然后遍历数组。
然后再在当前节点后面取左右指针,判断左右指针的值是否等于0-nums,然后分别左右移动。
怎么去重呢?
满足条件时,看左指针的值是否和前一个位置相等,右指针的值是否和和它后一个位置的值相等。
双指针法
代码如下:
时间复杂度:O(n²)
***隐藏网址***
难度:简单
描述:
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
题目示例
思路:
我们延续三数之和的思路,在三数之和外面再套一层循环。
时间复杂度:O(n³)
***隐藏网址***
难度:中等
描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 target 的长度最小的 连续子数组 ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
题目示例
思路
这道题是一道经典的滑动窗口问题。
image-20210801164436322
代码如下:
时间复杂度:O(n),虽然循环里套循环了,但是starrt和end各自被移动了n次,所以时间复杂度是O(n)。
***隐藏网址***
难度:简单
描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums ,并且 i 和 j 的差的 绝对值 至多为 k。
题目示例
思路:
上面我们做了一道滑动窗口的题,我们接着再做一道也可以用滑动窗口解决的问题。
这道题的滑动窗口略有区别,上一道题的窗口是活动的,这个是 固定的滑动窗口 ,维护一个长度为k的固定窗口,如果窗口内含有目标值,返回。如果窗口进入新的元素,就需要把头部的元素移除掉,保持窗口的长度。
固定窗口
代码如下:
时间复杂度:O(n)。
***隐藏网址***
难度:中等
描述:
今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers)会进入书店,所有这些顾客都会在那一分钟结束后离开。
在某些时候,书店老板会生气。如果书店老板在第 i 分钟生气,那么 grumpy = 0。当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。
请你返回这一天营业下来,最多有多少客户能够感到满意。
「示例:」
思路:
这道题是一道固定窗口的问题。
整体思路就是把不生气的部分作为固定窗口,固定窗口把customers分成了三部分,最后求三部分的最大和。
固定窗口
时间复杂度:O(n)。
空间复杂度:O(1)。
***隐藏网址***
难度:复杂
描述:
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
「示例 1:」
思路:
「哈希法」
这种找重复的数字问题,我们脑子里第一下就想起来,用Hash存储元素,然后进行比对。
代码实现也很简单:
时间复杂度:O(n)。
空间复杂度:O(n)
但今天的主角不是它,而是
「原地置换法」
我们注意到一个条件 所有数字都在 0 n-1 的范围内 ,那就在这方面进行操作,我们可以把元素放到它的值对应的下标的位置。
例如 num=1,那我们就把它放到下标1的位置。
接着遍历,元素发现它应该待的坑已经被它的双胞胎兄弟给占了,它就知道,它是多余的那个。
原地置换
代码如下:
时间复杂度:O(n)。
空间复杂度:O(1)
***隐藏网址***
难度:复杂
描述:
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
题目示例
思路
「辅助数组」
这道题有一个非常巧妙地的办法!
可以引入一个辅助数组,从1开始,在对应的位置存入原数组对应的元素。如原数组num。
然后遍历辅助数组,发现的第一个坑就是缺失的第一个正数。
辅助数组
代码如下:
时间复杂度:O(n)。
空间复杂度:O(n)。
「原地置换法」
我们上面用了原地置换法解决了一个问题,降低了空间复杂度,我们这道题是不是也可以呢?
原地置换没法修改数组长度,我们肯定不能nums存i。
原地置换
代码实现如下:
时间复杂度:O(n)。
空间复杂度:O(1)。
***隐藏网址***
难度:中等
描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 「顺时针螺旋顺序」 ,返回矩阵中的所有元素。
示例 1:
示例2
思路
这道题,思路比较容易想,就是上右下左四个方向顺时针遍历数组。
顺时针遍历数组
但是这道题的细节是魔鬼。
有两种,一种是一圈遍历完成,上下左右的位置移动,遍历是左闭右开[的条件。
我们采用的是第二种,每遍历完一条边,就移动对应的位置,遍历就是左闭右闭的条件。
还有一点细节就是值得注意的是,遍历过程中可能会出现出现 top 》 bottom || left 》 right ,其中一对边界彼此交错了。
这意味着此时所有项都遍历完了,如果没有及时 break ,就会重复遍历。
代码如下:
时间复杂度:O(mn),其中 m 和 n 分别是输入矩阵的行数和列数。
***隐藏网址***
难度:中等
描述:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例
思路
和上面一道题基本一模一样,我们往里面套就行了。
代码如下:
时间复杂度:O(n²)
剑指 Offer 29. 顺时针打印矩阵 也是一道类似的题目。
写了个顺口溜总结一下:
leetcode什么水平才能刷
leetcode最好能具备一定的基础水平才能刷。
leetcode是个很好用的刷题软件,不是学习到了什么程度才可以刷LeetCode。 平时使用LeetCode更多是用来做练习和巩固的,比如学习了链表,可能就取刷几道相关题,检测一下自己的掌握程度,从而反馈继续学习一些“遗漏”或者“没有掌握”的知识点。
刷leetcode的前提,建议不要完全零基础就一股脑的去刷题,如果啥都不会临时突击直接上去刷题,不出意外的话只会看着别人的题解刷题,看了别人的思路也不一定会写,就算写出来了很快就忘了。所以要对常见的算法有一定的基础,常见的模型较为了解之后再去刷题。
使用leetcode刷题的总结:
1、分类刷题:系地并且针对性的刷一类题:比如一段时间先刷递归,再双指针,再字符串等等。只要刷题就只刷一类的题,今天刷这类,明天刷另一类,同一类题目一起刷,可以更更好的总结经验规律和方法差异。
2、分类做笔记:把自己刷过的题做好算法分类写入笔记,标出每一题的思路关键字,把难懂的方法思路标注记号。
3、经常定时复习:定时复习(每天晚上,每周日,每月末)自己笔记里记录的算法题,并且把忘了的题权重+1,后期复习的时候把权重高的题多复习一次。200~300道题至少刷2到3遍。
4、bug free的能力:写代码的时候下意识想到界限,下意识想到可能出bug的代码并且处理它可能出现bug的地方(这个需要经验,也可以把自己经常出现bug的代码写入笔记中)。
5、写代码要快和反应都要快:写代码前把逻辑写在纸上,然后尽可能快速的把逻辑实现出来,培自己的代码风格。
leetcode plusone题目怎么通过
如何做LeetCode :LeetCode是一个准备面试非常有用工具,但是也有一定的不足,比如只有按照名称一种排序方法。另外LeetCode中的题目越来越多,目前124题,很多人并没有那么多时间去一一完成,那么怎样能够更有效率的进行练习呢?这里谈谈我的想法。由于以上的和其他一些问题,我利用圣诞节做了一个小小的工具 :这里谈谈如何使用。1、如果第一次做LeetCode,你可以按照难度来做。我按照题目的难度和面试出现的频率打了分,1是最低分,5是最高分。你可以按照难度排序,从最简单的做起,逐渐提高难度。2、如果你有一段时间没有做,而LeetCode加了新题,你只想做新题怎么办?你可以去我的那个网站,上边的题目是按照时间顺序排好序的。你可以很容易的找到新题。3、如果你没有时间做完所有的题目怎么办?你可以按照面试出现的频率来排序,从高频题做起。4、如果你已经做了Leetcode两三遍了,下一步如何提高?这个时候你需要一定的总结了,应该按照类型来做,比如按照数据结构分类来做,按照算法分类来做,同时可以参考我的题目总结的文章。满意请采纳,祝你学习进步。
更多文章:
i5八核处理器有哪些(谁给我介绍下酷睿i5处理器的各种型号和性能)
2024年4月27日 10:10
惠普官方系统(在惠普官网上面的win11系统镜像是原版的还是破解版的)
2024年6月4日 20:20
xp系统之家下载(在系统之家下载的xp系统还用在解压吗怎么解决)
2024年3月20日 14:50
联想e531升级有必要吗(联想ThinkpadE531装什么win7系统兼容性比较好)
2024年10月11日 21:00
第一次装机bios怎么设置(如何给新组装电脑做基本设置,BIOS设置)
2024年6月3日 22:00
oppo find n2评测(想问问,OPPO Find N2好不好)
2024年11月2日 11:10
360安全路由器v2参数(360安全路由器p2是百兆还是千兆)
2024年3月5日 18:10
佳能60d人像参数设置(佳能60D 镜头18 135IS 拍摄近景人像 选择AV档 光圈与焦距调到最佳位置是多少)
2024年10月11日 09:00
农村给老人“免费照相”的,他们靠什么盈利?无偿拍摄是什么意思
2024年3月21日 10:40
bps、pps与Bps的区别(均属计算机网络领域)?pps是什么缩写
2024年10月19日 03:20
乐视手机wifi已连接但上不了(里的无线网乐视手机络连接上不起网怎么解决)
2024年6月7日 22:00
vivo v3ma多少钱一台(vivo.v3ma能买多少钱)
2024年4月10日 09:30