leetcode
leetcode刷题日记,每个题使用java,C++,Kotlin,Python等其中的一种或多种语言来编写,思路都是一样的,哈哈哈~~~
心脏dance
求关注!!!求关注!!!安卓、后端学习记录,面试算法题(博主ACM区域赛银牌~~~水银嘻嘻~~~,蓝桥杯国一~~~),面试技术题。如果觉得博主写的好,菜鸡博主求关注~~~。 /*
呜呜呜~~大学的时候,写的博文中有些是借鉴的,若有侵权,请告知,立马删除。。。。 */
展开
-
791. 自定义字符串排序
思路:算是个简单题吧,中等有点过分了。用 map 通过 order 字符串重新定义下每个字符的大小关系,然后对 s 按照记录的大小关系排序即可。map 里面没有的字符,默认大小为任意一个值就可以了(因为可以在任意一个位置),我这里写的默认值是 0。原创 2022-11-13 16:43:40 · 281 阅读 · 0 评论 -
1768. 交替合并字符串
做个水题放松下!for循环一遍即可,不过多解释了,直接看代码。原创 2022-10-23 15:57:12 · 158 阅读 · 0 评论 -
73. 矩阵置零
思路:因为m和n最大是200,所以就算每个数都不一样最多有400个不同的数,所以我们从0到400中必然能找到一个数与矩阵中所有数都不一样的值,我们就用这个数来标记就可以了。注意:标记的时候不能改变原先为0的值,因为后面还要用原先为0的值来做改变。最后把标记的值变成0就可以了。时间复杂度:O(401*mn)空间复杂度:O(1)原创 2022-10-07 13:42:41 · 88 阅读 · 0 评论 -
229. 多数元素 II
数据大于floor(n/3)向下取整的数最多只有两个(仔细想想),或者1个,或者没有。这样的话就采取类似最近很火的游戏“羊了个羊”消除,当然区别就是我们槽位只有2个,点击第三个的时候只有不一样这三个才会同时消除,如果相同就叠在对应的槽位上,这样最后剩下的两个槽位上面的值才有可能大于floor(n/3),为什么说有可能,因为存在一种特殊情况:【3,2,3】,这种情况下通过我们的算法最后会出现,第一个槽位剩下3,第二个槽位剩下2,但是只有3是满足的,所以最后我们再把这两个值验证一下即可。原创 2022-09-30 21:44:23 · 542 阅读 · 0 评论 -
1302. 层数最深叶子节点的和
思路:bfs一层一层求和,当没有下一层的时候(就是队列为empty的时候)就是最后一层,记录下结果即可。原创 2022-08-17 15:36:06 · 105 阅读 · 0 评论 -
812. 最大三角形面积
题目链接:力扣思路:第一想法要用什么算法呢?然后看了一眼是简单题,那肯定用不到啊。看了一眼数据,最多50个点,好吧,果断O(n^3)暴力解决。枚举所有三角形的面积,每次取一下最大值即可。因为题目给出了三个顶点的坐标,所以我们直接用向量来计算三角形的面积即可。公式:在中,,,则上代码:import kotlin.math.absimport kotlin.math.maxclass Solution { fun largestTriangleArea(points: Array原创 2022-05-15 18:54:40 · 251 阅读 · 0 评论 -
11. 盛最多水的容器
题目链接:力扣思路:首先吐槽下kotlin的for循环(我感觉kotlin的for循环真的好难用),还有就是啥时候有一种语言,各种集合的遍历方式是统一的就好了(目前在我的认知里面还没有)。这道题目是典型的双指针问题。定义两个指针 i,j ,然后开始遍历height数组即可。怎么遍历呢?首先我们需要思考下,在宽度一定的情况下,高是怎么确定的呢?很简单,因为是装水,所以高是通过矮的那边确定的。这样我们就可以做了。找到宽(j-i),找到高(左右指针指向的较矮的那边的高度),两者相乘即可。然后较矮的那边的指原创 2022-05-03 14:26:24 · 856 阅读 · 1 评论 -
908. 最小差值 I
题目链接:力扣思路:1. 当 maxValue - minValue > 2 * k 时,说明在2K的范围内最大值与最小值的差最小能变成 maxValue - minValue - 2 * k2. 当 maxValue - minValue <= 2 * k 时,说明在2K的范围内最大值与最小值的差最小能变成0有人可能会问,不考虑别的值吗?为什么只考虑最大值和最小值?因为最大值与最小值的差能缩小的范围 > 别的值能缩小的范围。也就是说,最大值与最小值的差能缩小到的值,别原创 2022-04-30 16:55:19 · 169 阅读 · 0 评论 -
819. 最常见的单词
题目链接:力扣思路:题目不难,需要注意下细节。一定不要只用空格作为分隔符,然后每个单词删除不是字母的字符,有的样例是这样的“a,b,c”,这是三个字符,但是没有空格,所以就需要用题目给的标点符号和空格进行分隔,“it's” 题目认为这也是两个单词,所以就直接用题目给的标点符号和空格分隔即可。分割完成后,可能存在空字符串,所以需要过滤出length>0的字符,最后进行逻辑处理即可(逻辑处理过程看代码,简单题不做说明了)上代码:class Solution { fun mostC原创 2022-04-17 15:38:47 · 298 阅读 · 1 评论 -
479. 最大回文数乘积
题目链接:力扣思路:首先这个题我也是猜测了一下,就是n位数,最终的答案一定是2*n位数,我猜的。因为答案是2*n位数,这样的话我就枚举前n位数(从大到小),然后拼接后面n位数,得到一个2*n位数的回文。此时外层循环最大循环次数为1e8,然后里面就从得到的这个2*n位数下手,找到2个n位数的乘积是它就可以了,能找到就返回,找不到就接着找。内层循环就从最大的n位数到sqrt(2*n位的这个数) 或者从sqrt(2*n位的这个数)到最小的n位数(不知道为什么用sqrt作为一个枚举边界的可以自行学习,或者在底下原创 2022-04-16 17:28:09 · 2343 阅读 · 0 评论 -
307. 区域和检索 - 数组可修改
树状数组的单点更新,区间求和。不懂树状数组的可以去网上学习。单点更新和区间求和的时候需要注意一下,因为树状数组是从1开始的,所以单点更新的时候需要更新的位置为 index+1 ,区间求和的时候需要 right + 1 减left(这个地方大家自己思考一下,还是不懂的可以在评论区指出哦~~~)原创 2022-04-04 16:09:45 · 422 阅读 · 0 评论 -
2028. 找出缺失的观测数据
题目链接:力扣思路:简单构造题。sumN = n数组的和,sumM = m数组的和。这个题就是构造sumN = (n+m)*mean-sumM 这个数。通过n个数的和构造词出sumN这个数,限制条件就是这n个数的取值范围[1,6]。这不就很简单了。首先考虑不可能的情况。考虑两个极限值:1. sumN > n * 6 说明n个数全是最大值6也不行2. sumN < n 说明n个数全是最小值1也不行除了这两种情况都是可行的情况。可行的情况怎么构造呢?我这里考虑通过6和1来构造原创 2022-03-27 17:19:07 · 680 阅读 · 0 评论 -
682. 棒球比赛
题目链接:力扣思路:用栈来模拟操作就可以了。注意:留意下 “+” 的操作。上代码:class Solution { fun calPoints(ops: Array<String>): Int { val mStack = Stack<Int>() var result = 0 ops.forEach { str -> when (str) { "+"原创 2022-03-26 15:49:42 · 444 阅读 · 0 评论 -
72. 编辑距离
题目链接:力扣思路:先上递推式:dp[i][j] 代表 word1 中前 i 个字符,变换到 word2 中前 j 个字符,最短需要操作的次数注意:需要考虑 word1 或 word2 一个字母都没有,即全增加/删除的情况,所以初始化值dp[0][j] 和 dp[i][0](看代码逻辑)状态转移改:dp[i][j] = dp[i - 1][j - 1] + 1删:dp[i][j] = dp[i - 1][j] + 1增:dp[i][j] = dp[i][j - 1] + 1按顺.原创 2022-03-13 16:43:00 · 816 阅读 · 0 评论 -
1143. 最长公共子序列
题目链接:力扣思路:动态规划入门题先上递推式:递推式怎么来的呢?给定两个字符串 S1 , S2,设序列 S1 = {x1, x2, x3 ... xn} , S2 = {y1, y2, y3 ... ym} , 的最长公共子序列是 S = {z1, z2, z3 ... zk} 。1. 如果 xn = ym , 则 zk = xn = ym , 那么 S[k - 1] 就是 S1[n - 1] 和 S2[m - 1] 的 最长公共子序列2. 如果 xn != ym , 且zk != ..原创 2022-03-13 15:58:40 · 469 阅读 · 0 评论 -
136. 只出现一次的数字
题目链接:力扣思路:任何一个数与0“异或”是他本身,两个相同的数“异或”为0。上代码:class Solution { fun singleNumber(nums: IntArray): Int { var result = 0 for (i in nums.indices) { result = result xor nums[i] } return result }}...原创 2022-01-23 15:42:14 · 332 阅读 · 0 评论 -
125. 验证回文串
题目链接:https://leetcode-cn.com/problems/valid-palindrome/思路:两个指针前后一起遍历一遍即可。遍历的时候,碰到不是字符和数字的就跳过,是数字和字符的就判断是不是相等,不相等就不是回文串直接返回false。最后遍历完成,没出现返回false的情况,就说明是回文串,返回ture。上代码:class Solution { fun isPalindrome(s: String): Boolean { val str = s.t原创 2022-01-16 21:58:22 · 109 阅读 · 0 评论 -
5920. 分配给商店的最多商品的最小值
题目链接:力扣思路:最小化分配的最大值,这种说法想到二分~~二分什么呢?直接二分答案即可。端点为 l = 0,r = 数组中的最大值。二分一个值,然后判断这个值:如果按照这个值分完还有剩余,也就是需要更多的商店来分,说明值太小了不符合题意,那就需要把这个值变大。如果能分完,那就把这个值变小。这样不断进行二分,最终就会获得正确答案了~~注意:当mid为0的时候就不需要再进行判断了,一定不行,多少商店都分不完~~~~~~。我的 check 这个函数,貌似还能优化,不过我这样写也是ok的~~~时间原创 2021-11-07 13:44:48 · 175 阅读 · 0 评论 -
5919. 所有子字符串中的元音
题目链接:力扣思路:很明显这是一个求贡献的题~~求每个元音字符的贡献,然后求和。首先大家肯定会想到暴力,以看数据量不行,那就想到求贡献~~举个例子:abcdefge这个元音字符能做的贡献有哪儿些字符呢?我是想到用两部分合起来的:第一部分:abcde、bcde、cde、de、e、ef、efg 这一部分的贡献值是字符串的长度也就是7,怎么算呢?就是 len-i+i = len i表示当前字符的位置(从0开始)。这一部分的特点是e都在子字符串的边上,也就是没有跨过e的两边。第二部分:abc原创 2021-11-07 13:30:41 · 157 阅读 · 0 评论 -
5918. 统计字符串中的元音子字符串
题目链接:力扣思路:暴力三层循环,判断所有子字符串是否符合题意即可。注意:需要子字符串5个元音字符都要有。我是用map来标记的~~~map的大小就是子字符串有几个元音字符~~上代码:class Solution { fun countVowelSubstrings(word: String): Int { var cnt = 0 var flag = true val wordMap = HashMap<Char, Boolean&原创 2021-11-07 13:16:27 · 171 阅读 · 0 评论 -
5916. 转化数字的最小运算数
题目链接:力扣思路:bfs暴力搜索即可。每一种情况都搜一遍,已经搜过的值标记一下,不要重复搜。越界的值也不需要继续往下搜哦~~~(好久没写bfs了,手生了,忘记标记一开始的start了~~注意一下,一开始的start也要标记一下,要不后面必然也会造成重复搜~~~造成结果错误~~~)上代码:class Solution { private val numMap = HashMap<Int, Boolean>() private val queue = LinkedL原创 2021-10-31 15:20:46 · 194 阅读 · 0 评论 -
5915. 找出临界点之间的最小和最大距离
题目链接:力扣思路:用三个指针标记三个位置,从前往后找满足条件的小标,放在数组里面,最大距离好找,就是数组中最后一个和第一个的差,最小距离就是数组中相邻的两个值的差的最小值(最下距离,在循环的时候判断一下即可,这是一个坑点)~~上代码:/** * Example: * var li = ListNode(5) * var v = li.`val` * Definition for singly-linked list. * class ListNode(var `val`: Int)原创 2021-10-31 13:56:53 · 264 阅读 · 0 评论 -
5914. 值相等的最小索引
题目链接:力扣思路:从前往后按照题目给的公式来判断,找到就返回下标,最后找不到返回-1即可,很水~~~上代码:class Solution { fun smallestEqual(nums: IntArray): Int { for (i in nums.indices) { if (i % 10 == nums[i]) { return i } } retu原创 2021-10-31 13:32:02 · 127 阅读 · 0 评论 -
36. 有效的数独
题目链接:https://leetcode-cn.com/problems/valid-sudoku/思路:用三个数组分别标记一下。signRow[行][值]、signCol[列][值]、signCell[小正方形][值],标记(1 - 9) 是不是被用过即可(代码里面标记的 0 - 8 ,一个意思的,只是为了节约一丢丢空间而已)。上代码:class Solution { private val signRow = Array(9) { BooleanArray(9) } .原创 2021-09-12 16:22:41 · 78 阅读 · 0 评论 -
37. 解数独
题目链接:https://leetcode-cn.com/problems/sudoku-solver/吐槽:自己好久没写递归了,导致这个题让我的周末很不愉快~~,都他喵快写了3个小时~~,也与自己对kotlin不熟悉有关~~思路:就是递归~~先说明一下坑点(借助代码里的内容说明):1. flag,题目明确说明只有一个结果。有结果就结束递归!!!!之前打ACM的时候都是有结果就输出,现在知道,其实程序输出结果后还在继续运行,如果不停止,就会导致最后内存中的board不是自己想要的结果~~~2原创 2021-09-11 17:50:20 · 90 阅读 · 0 评论 -
168. Excel表列名称
题目链接:https://leetcode-cn.com/problems/excel-sheet-column-title/思路:可以很容易想到是26进制,但是当我们用26进制来做的时候,发现会有一定的出入,比如说ZY -> 701当我们用26进制来写的时候会输出AZY。为什么呢,这里说一下:1. 701 % 26 = 25 此时我们拼接 Y 然后 701 / 26 = 262. 26 % 26 = 0 此时我们拼接 Z 然后 26 / 26 = 13. 1 % 26 = 1 此..原创 2021-07-24 17:59:38 · 85 阅读 · 0 评论 -
75. 颜色分类
题目链接:https://leetcode-cn.com/problems/sort-colors/思路:用两个指针,一个表示0的位置(p0),一个表示1的位置(p1)。然后从前往后遍历,有三种情况:(1)如果i的位置的元素是0,就交换p0与i的位置的元素。此时还需要判断p0的位置的元素是不是1,也就是判断p0是不是小于p1,如果是则再交换p1与i的位置的元素(就是把前面交换到i位置的1再交换到p1的位置),如果不是就什么都不做。最后p0++,p1++(2)如果i的位置的元素是1,就交换p1与i原创 2021-07-11 16:22:56 · 66 阅读 · 0 评论 -
80. 删除有序数组中的重复项 II
题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/思路:两个指针,一个表示最终结果的指针(index),一个是表示遍历的指针(i),通过判断最终结果数组中的元素是不是跟当前遍历的元素相等,来判断需不需要加进最终结果中。判断方式:nums[i] != nums[index - 2] 这样判断的原因是,每个元素最多可以出现两次,所以与index-2位置的元素比较即可。上代码:class Solu原创 2021-07-10 16:06:23 · 112 阅读 · 0 评论 -
104. 二叉树的最大深度
题目链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/思路:dfs暴力搜索,一条链一条链的暴搜即可。上代码:/** * Example: * var ti = TreeNode(5) * var v = ti.`val` * Definition for a binary tree node. * class TreeNode(var `val`: Int) { * var left: Tree原创 2021-07-08 20:36:43 · 73 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/思路:买股票就是只要下一天比当前天多就可以买然后第二天就可以卖,当让也可以第二天不卖或者卖了接着买进来,这样做就是最优解~~~(贪心算法)上代码:class Solution { fun maxProfit(prices: IntArray): Int { var result = 0 for (i in 0原创 2021-06-17 12:17:14 · 80 阅读 · 0 评论 -
121. 买卖股票的最佳时机
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/思路:遍历每一天,假设当前天为卖出的那一天,减去在此之前的最小值(包括当前这一天),这样的话每种情况(局部最优解)都考虑到了,取一个最大值即可~~~上代码:class Solution { fun maxProfit(prices: IntArray): Int { var max = 0 var min = Int原创 2021-06-17 11:53:13 · 68 阅读 · 0 评论 -
852. 山脉数组的峰顶索引
题目链接:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/思路:二分一个位置,比较该位置的数与它左右的位置的数的大小。比较方法:见代码里面的两个if语句即可~~~~上代码:class Solution { fun peakIndexInMountainArray(arr: IntArray): Int { var l = 0 var r = arr.size - 1原创 2021-06-15 19:32:05 · 68 阅读 · 1 评论 -
279. 完全平方数
题目链接:https://leetcode-cn.com/problems/perfect-squares/思路:四平方和定理:任意一个正整数至多可以表示为4个正整数的平方和。这就是本题答案的上界。所以说本题答案只可能是1,2,3,4判断方式如下:答案是1:判断这个数本身是不是平方数答案是2:判断x^2+y^2=n是不是成立。枚举x(1-sqrt(n)),然后判断n-x^2是不是平方数答案是3:由于判断3的话没有什么特别好的方式,所以排除其余三种情况剩下的答案就是3答案是4:判断n=原创 2021-06-11 13:03:04 · 75 阅读 · 2 评论 -
66. 加一
题目链接:https://leetcode-cn.com/problems/plus-one/思路:原创 2021-06-01 17:10:27 · 77 阅读 · 0 评论 -
203. 移除链表元素
题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/思路:建立一个新的头节点指向head,这样的原因是好判断删除。然后用一个临时指针来进行操作(临时指针等于新的头节点,原因是好用next的那个节点判断),当碰到相等的节点值,就把next指向next的next即可,如果不相等就移动到next节点即可。上代码:/** * Example: * var li = ListNode(5) * var v = li.`原创 2021-06-05 21:46:10 · 62 阅读 · 0 评论 -
160. 相交链表
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/原创 2021-06-04 20:58:34 · 69 阅读 · 0 评论 -
131. 分割回文串
题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/上代码:原创 2021-05-31 17:02:02 · 70 阅读 · 0 评论 -
231. 2 的幂
题目链接:https://leetcode-cn.com/problems/power-of-two/思路:首先li'yon原创 2021-05-30 13:47:35 · 108 阅读 · 0 评论 -
1074. 元素和为目标值的子矩阵数量
题目链接:https://leetcode-cn.com/problems/number-of-submatrices-that-sum-to-target/思路:上代码:原创 2021-05-29 17:55:55 · 120 阅读 · 0 评论 -
477. 汉明距离总和
题目链接:https://leetcode-cn.com/problems/total-hamming-distance/思路:第一种原创 2021-05-28 15:07:41 · 77 阅读 · 1 评论