萌新的每日一练
为了丸山而添彩
萌新
展开
-
LeetCode第733题:图像渲染(python)
DFS原创 2022-10-10 20:44:11 · 234 阅读 · 1 评论 -
LeetCode第69题:x 的平方根(python)
69. x 的平方根原创 2022-10-08 21:13:11 · 216 阅读 · 0 评论 -
LeetCode第125题:验证回文串(python)
题目:思路1使用切片的思路去做,首先对字符串s进行处理,将其中的大写字母变成小写字母,去除空格,特殊符号,只保留数字和字母,记为s1。之后将s1进行翻转,即if s1 == s1[::-1],相同则True,不同则False。代码如下:class Solution: def isPalindrome(self, s: str) -> bool: s1 = [] for i in s: if 'a' <= i <= '原创 2021-11-09 20:54:18 · 716 阅读 · 0 评论 -
LeetCode第50题:Pow(x, n)(python)
题目:思路1:既然用python的话,就可以当一次高级调用工程师了(逃直接pow函数求解代码如下:class Solution: def myPow(self, x: float, n: int) -> float: result = pow(x, n) return result思路2:上面那个在面试的时候千万不要用嗷,不然就是回家等通知了(误回归正题,假设现在要计算x13,那可以将其分解成x8 * x4 * x1,也就是利用分治的思想,将原创 2021-11-08 20:27:10 · 441 阅读 · 0 评论 -
LeetCode49题:字母异位词分组(python)
题目:思路1:这个题可以用很简单的方法,因为源单词中的字母只能用一次,因此可以先把单词进行排序,将排序过后的单词作为哈希表的key,并将和排序后与这个key一样的单词加入到value,最后输出value就行。代码如下:import collectionsclass Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: s = collections.defaultdict(li原创 2021-10-19 20:40:38 · 221 阅读 · 0 评论 -
LeetCode第66题:加一(python)
题目:思路:这个题一开始看起来很绕,实际上可以看成,把数组中的各个数组合起来变成一个整数,然后加一,返回的结果是每一位数。因此很简单,加法运算无非考虑的只有进位的问题,也就是说末位是9的时候,+1之后的进位问题。因此可以写个循环,判断当前位是否需要进位,需要则将此位变成0,前一位+1,以此类推。还有一个注意的点:首位进位变成10之后也需要进行处理,因为会多一位数字。代码如下:class Solution: def plusOne(self, digits: List[int]) -&g原创 2021-10-11 15:04:12 · 218 阅读 · 0 评论 -
LeetCode第58题:最后一个单词(python)
题目:思路:从右往左遍历,设立一个计数器,遇到空格就跳过,遇到字符则计数,相当于用这个计数器寻找两个空格之间的字符数量。代码如下:# 检索空格的区间class Solution: def lengthOfLastWord(self, s: str) -> int: length = len(s) # 计数器 num = 0 for i in range(length - 1, -1, -1):原创 2021-09-15 21:05:09 · 108 阅读 · 0 评论 -
LeetCode第38题:外观数列(python)
题目:思路:题目看起来很绕,实际上就是利用这个函数来数数,比如说n=3的时候,数n=2的时候一共有几个数,n=2的时候字符串为’11’,也就是2个1,所以输出结果为’21’弄明白题意之后,就按顺序遍历字符串,只考虑n>2时的情况(因为n=1和n=2的时候结果是已知的),如果当前位i和下一位i+1的字符相同,则让字符数+1;如果不同,则对字符串进行拼接;最后一组字符需要单拿出来进行拼接。按照此思路写出的代码如下:class Solution: def countAndSay(self原创 2021-09-13 16:41:47 · 93 阅读 · 0 评论 -
LeetCode第27题:移除元素(python)
题目:思路一:题目要求正确的元素没有顺序,因此利用这一点,首先令m = max(nums),取出数组中的最大值,然后寻找数组中和val相等的值,将他们改为m+1,这个m+1是一定不在原数组中的。然后将新的数组进行排序,并遍历新数组,找出第一个等于m+1的下标,return即可。代码:# 方法一class Solution: def removeElement(self, nums: List[int], val: int) -> int: if not nums:原创 2021-09-08 16:09:47 · 285 阅读 · 0 评论 -
LeetCode第350题:两个数组的交集 II(python)
题目:思路:直接进行查找,先设立一个空数组res,之后根据nums1和nums2的长度来进行操作当len(nums1) > len(nums2)时:检查nums2的元素,并判断是否出现在nums1中,出现则加入res,并移除nums1中的这个元素当len(nums1) < len(nums2)时,同样执行上面的操作,只不过操作的数组要交换一下代码如下:class Solution: def intersect(self, nums1: List[int], nums2: L原创 2021-08-01 14:39:34 · 77 阅读 · 0 评论 -
LeetCode第53题:最大子序和(python)
题目:思路:利用动态规划,首先确定子问题,题目给定要求是求“连续的”,因此可以把子问题设置为:求到第i个位置的n个数的总和。设dp[i]为到i位置时num[i]的和;这时候进行分类讨论(写状态转移方程),当dp[i-1]>0时,此时相加的结果一定是大于本身nums[i]的,因此这时候的状态为:dp[i] = dp[i - 1] + nums[i],当dp[i-1]<=0时,此时相加的结果会变小,因此选择nums[i],即dp[i] = nums[i]代码如下:class Solutio原创 2021-07-29 20:56:28 · 183 阅读 · 0 评论 -
LeetCode第217题:存在重复元素
题目:思路1:首先对数组进行排序,排序之后的重复数字一定是挨在一起的,这时只需要判断相邻数字是否重复即可。代码如下:# 排序方法class Solution: def containsDuplicate(self, nums: List[int]) -> bool: nums.sort() for i in range(len(nums)-1): if nums[i] == nums[i+1]:原创 2021-07-29 11:07:06 · 82 阅读 · 0 评论 -
LeetCode第48题:旋转图像
题目:思路:对于这道题我的想法是分两步进行旋转首先,调换数组的正对角线元素:调换前[ [1,2,3], [4,5,6], [7,8,9]]调换之后:[ [9,6,3], [8,5,2], [7,4,1]]第一步的的方法是:设n=len(matrix),对于两个对角线元素(x1,y1),(x2,y2),有x1+y2=n-1; x2+y1=n-1因此利用这一点,交换对角线元素,为第二步交换做准备第二步:交换对应行的所有元素取(n+1)/2作为边界(防止交换完之后又原创 2021-07-28 11:26:56 · 97 阅读 · 0 评论 -
LeetCode第40题:组合总和 II
题目:思路:对于“寻找”这种题目,可以用递归的方法去做,首先把数组排序,然后让target分别减去数组中的每一个数,如果减到最后的结果不为0,则返回上一级,重新选个数进行减法运算,把结果等于0的存储,不等于0的扔掉。整个逻辑写完可以用“树”来表示(此处图有时间补上,有图就很好理解)代码如下:class Solution: def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:原创 2021-07-26 19:06:04 · 98 阅读 · 0 评论 -
LeetCode第36题:有效的数独
题目:思路:对于行和列的重复数字判断是比较好搞的,问题的关键在于这个3x3的小矩阵判断,涨知识的公式来了:temp = (i // 3) * 3 + j // 3,这个公式可以将9x9的大矩阵变成9个3x3的小矩阵,大概是这样的(图有点丑,主要是为了理解题意)先创建字典,分别为row,col,cell(存储3x3单元格),然后将除了“.”的数字存到字典的key中,value为任意值,每次都比较key值是否出现相同的,若出现则返回false。代码如下:class Solution: d原创 2021-07-23 15:39:00 · 176 阅读 · 0 评论 -
LeetCode第34题:在排序数组中查找元素的第一个和最后一个位置
题目:思路:最开始想的比较简单,直接遍历求位置就行了,结果发现题目要求还有结束位置,普通的遍历不太好办,果断转换思路,用二分法。二分法求这种问题就很简单了,定义区间,求区间的左右边界,最后把左右边界加入数组返回就好了。代码如下:class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: i = 0 j = len(nums) - 1原创 2021-07-22 15:37:55 · 60 阅读 · 0 评论 -
LeetCode第31题:下一个排列
题目:解释:这道题的下一个排列指的是比当前给定数组要大的数组,举个例子,把[1,2,3]进行从小到大的全排列,如下所示[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2][3,2,1]题目中[1,2,3]的下一个排列就是[1,3,2]了思路:弄明白题意之后,接下来要思考怎么求解下一个排列,这里我用了一种交换的思路,首先从后向前寻找第一个降序数字,例如[1,2,3]中2是第一个降序数字,那么就要寻找第一个比2大的数字,也就是3,此时交换他们的位置,并把交换之后2以及2原创 2021-07-21 14:46:33 · 73 阅读 · 0 评论 -
LeetCode剑指 Offer 53 - I. 在排序数组中查找数字 I
题目:思路1:第一想到的应该就是暴力求解了,设置计数器,遍历数组,如果遇到与target相同的数字,就让计数器+1,最后return 计数器即可。代码如下:# 最简单的 直接遍历 时间复杂度为O(n)class Solution: def search(self, nums: List[int], target: int) -> int: # 设置计数器temp temp = 0 for i in range(len(nums)):原创 2021-07-19 10:22:35 · 65 阅读 · 0 评论 -
LeetCode第13题:罗马数字转整数
题目:思路:首先建立字典,把对应的罗马数字与整数写好,之后遍历字符串s,并判断第一个字符的数值与第二个字符的大小,如果小就减去,大就加上,这样就能解决类似于IV这样的情况了。然后是遍历字符串的时候,是从0到len(s)-1,因为每次比大小都是和后一位比,如果遍历到最后一位,就会发生越界的情况。因此最后一位的数值直接加上就好了。代码如下:class Solution: def romanToInt(self, s: str) -> int: example = {原创 2021-07-15 14:23:50 · 54 阅读 · 0 评论 -
LeetCode第18题:四数之和
题目:思路:因为是四个数,此时需要固定两个数的位置,移动另外两个数的位置就能做到遍历。设i从第0个开始,j从第1个开始,k从第2个开始,l从最后一个开始,即:for i in range(0, len(nums)): for j in range(i+1, len(nums)-2): k = j + 1 l = len(nums) - 1之后判断四个数的和是否等于target,相等则加入res数组,不等就继续查找,如果当前值小于target,则移动k,大于原创 2021-07-14 19:15:14 · 106 阅读 · 0 评论 -
LeetCode第16题:最接近的三数之和
题目:思路:首先要对数组进行排序,方便后续的操作,并暂时存储前三个数的和用作后续的比较。之后定义三个数的位置,利用i j k 来表示的话,假设i是第0个,则j=i+1,k=len(nums)-1,之后需要存储三数之和并与前三个数的和进行比较,并根据三数之和的大小来移动j和k的位置(文字说明可能有些不清晰,可以看代码注释进行理解)代码如下:class Solution: def threeSumClosest(self, nums: List[int], target: int) ->原创 2021-07-14 10:09:29 · 75 阅读 · 0 评论 -
LeetCode第29题:两数相除
题目:思路1:除法本质上是减法,因此可以把这道题当做减法做,让被除数减去除数,直到除数小于被除数为止,设立一个计数器temp,记录减的次数就是最终的结果(因为我没用这个方法就没有写代码,此处提供一个简单思路。)思路2:利用二进制移位除法公式是:a/b=c……d转换一下可以写成:a=bc+d想求的是这个c所谓二进制移位 就是你考虑用2^k逼近这个c 也就是要写非常多个a = bi * 2^ki + d最后的结果是∑2^ki比如第一个case 10除以310 = 3 * 2^1 + 4原创 2021-07-13 15:44:50 · 120 阅读 · 0 评论 -
LeetCode第7题:整数反转
思路:对于一个int类型的数字x,我们是不方便操作的,因此可以先把x转换成字符串类型,并加入列表,之后利用remove函数去掉负号,再用reverse函数对列表进行反转就完成了。代码:class Solution: def reverse(self, x: int) -> int: Min = -2 ** 31 Max = 2 ** 31 - 1 # 先转换成字符串,方便操作 chars = list(str(x)) .原创 2021-07-12 15:35:01 · 80 阅读 · 0 评论 -
LeetCode第15题:三数之和
思路:这道题可以用很常规的方法去做,由于是判断三个数的和,因此可以先进行一个从小到大的排序,然后固定第一个数(首先保证第一个数不能>0,要不然三个数的和一定是>0的)之后从第二个数开始,让第二个数和最后一个数相加,看是否等于第一个数的相反数,也就是nums[j] + nums[k] == -nums[i]。如果成立则把三个数加入列表。不成立的话,判断j和k的关系,逐步缩小范围,就能取得最终的结果。代码如下:class Solution: def threeSum(self, .原创 2021-07-07 10:08:37 · 52 阅读 · 0 评论 -
LeetCode第198题: 打家劫舍
题目:思路:先从简单的部分说起,首先是nums中没有元素,这个很简单直接return 0然后是只有一个元素的情况,直接return nums[0] ,毕竟小偷不能空手而归嘛接下来是两个元素,只能取一个的情况下肯定是大的,即max(nums[0], nums[1])下面就是讨论的重点了元素有三个,那就分为两种情况,要么取1 3 要么取2。也就是说看谁比较大就取谁,这时候可以利用动态规划来做,用**dp[i]**来表示前 i 间房屋能偷窃到的最高总金额,就可以写出下面的这段方程dp[i] = ma原创 2021-04-15 14:39:15 · 217 阅读 · 0 评论 -
LeetCode153题:寻找旋转排序数组中的最小值
题目:已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个元素值 互不相同 的数组 nu原创 2021-04-08 14:42:13 · 96 阅读 · 0 评论 -
萌新练习写代码的每日一练:最长回文子串
题目:给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”思路:可以用动态规划的方法解决,先遍历字符串,当 s[i+1:j-1]是回文串,并且 s的第 i 和 j 个字母相同时,s[i:j]才会是回文串。这是字符串长度>2时候的情况,字符串长度=1一定原创 2021-03-11 15:54:43 · 114 阅读 · 0 评论 -
萌新练习写代码的每日一练:无重复字符的最长子串
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列原创 2021-03-08 14:52:58 · 94 阅读 · 0 评论 -
萌新练习写代码的每日一练:不同路径
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?思路:题目已经规定了只能向下和向右走,就不需要考虑机器人绕圈的情况了(误使用动态规划,可以先规定这个表格的值,令第一行和第一列为1,其余都为0,也就是下图这个样子之后利用num[i][j] = num[i - 1][j] + num[i][j - 1],也就是说每个位置都是原创 2021-01-29 16:54:36 · 157 阅读 · 0 评论 -
萌新练习写代码的每日一练:比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]思路:先建立一个哈希表dic,用来记录每个数对应比特位为1的数量,之后设立一个pre并对每个数i和它前一个数i-1进行按位与运算,如果结果为0,则说明两个数的比特位没有重复项,直接计算就可;但如果不为0,说明有重复项,也就是说某个数i去掉最高位1构成的数pre在之前被访原创 2021-01-26 17:14:05 · 74 阅读 · 0 评论 -
萌新练习写代码的每日一练:对链表进行插入排序
题目:对链表进行插入排序示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5思路:个人认为这就是对数组的排序与链表插入操作的结合,比大小,大的就接到后边,小的放前面用dummy记录,然后用pre指向dummy可以让pre一直指向最前面的数字(链表其实是我比较不擅长的东西,经常拆了又接上,然后就乱了)代码:c原创 2021-01-22 10:56:29 · 83 阅读 · 0 评论 -
萌新练习写代码的每日一练:删除排序数组中的重复项 II
给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,1,2,2,3]输出:5, nums = [1,1,2,2,3]解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 你不需要考虑数组中超出新长度后面的元素。思路:一开始的想法是创建字典原创 2021-01-19 15:30:57 · 129 阅读 · 0 评论 -
萌新练习写代码的每日一练:可被 5 整除的二进制前缀
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。示例 1:输入:[0,1,1]输出:[true,false,false]解释:输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。思路:运原创 2021-01-15 15:03:38 · 143 阅读 · 0 评论 -
萌新练习写代码的每日一练:完全二叉树的节点个数
题目:给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:思路:这道题第一想法就是暴力递归,从根节点开始依次向下搜索左孩子与右孩子,如果有则数量+1,并且在最后的结果也需要+1(因为根节点也要计算进去)代码:# Definition for a binary tree node.# class T原创 2021-01-12 14:48:42 · 72 阅读 · 0 评论 -
萌新练习写代码的每日一练:旋转数组
题目:给定一个数组,将数组中的元素向右移动 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]思路:这道题我一开始的想法是 建立一个空数组data 然后把原数组要移动的值放进data里 最后在整合但我一直纠结的问题是 我应该怎么挪这个数 然后就想栈啊原创 2021-01-08 16:40:17 · 153 阅读 · 0 评论 -
萌新练习写代码的每日一练:二叉搜索树中的插入操作
题目:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。示例 1:输入:root = [4,2,7,1,3], val = 5输出:[4,2,7,1,3,5]思路:设立三个节点root father val分别代表当前节点,父亲节点,要插入的节点,之后按顺序遍历,把给定的数值插入,原创 2021-01-05 15:46:05 · 170 阅读 · 2 评论 -
萌新练习写代码的每日一练:格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。格雷编码序列必须以 0 开头。示例 1:输入: 2输出: [0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 010 - 211 - 301 - 1示例 2:输入: 0输出原创 2020-12-29 20:42:18 · 85 阅读 · 0 评论 -
萌新练习写代码的每日一练:分发糖果
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、题目二、思路总结一、题目老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输入:原创 2020-12-24 21:12:19 · 163 阅读 · 0 评论 -
萌新练习写代码的每日一练:除自身以外数组的乘积
题目:给你一个长度为n的整数数组nums,其中n > 1,返回输出数组output,其中 output[i]等于nums中除nums[i]之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在O(n) 时间复杂度内完成此题。思路:可以建立两张空表L、R,作为当前节点nums[i...原创 2020-12-22 11:15:24 · 73 阅读 · 0 评论 -
萌新练习写代码的每日一练:只出现一次的数字III
给定一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :输入: [1,2,1,3,2,5]输出: [3,5]注意:结果输出的顺序并不重要,对于上面的例子,[5, 3]也是正确答案。你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?思路:一开始想的是用暴力求解,虽然能做出来,但时间复杂度为O(N^2),超时了www,先列一下代码(其实不用列,但还是想记录一下自己的错误)第一次的代码:class ...原创 2020-11-20 21:57:49 · 161 阅读 · 0 评论