自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 问答 (1)
  • 收藏
  • 关注

原创 LeetCode第733题:图像渲染(python)

DFS

2022-10-10 20:44:11 235 1

原创 LeetCode第69题:x 的平方根(python)

69. x 的平方根

2022-10-08 21:13:11 217

原创 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 720

原创 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 443

原创 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 223

原创 LeetCode第66题:加一(python)

题目:思路:这个题一开始看起来很绕,实际上可以看成,把数组中的各个数组合起来变成一个整数,然后加一,返回的结果是每一位数。因此很简单,加法运算无非考虑的只有进位的问题,也就是说末位是9的时候,+1之后的进位问题。因此可以写个循环,判断当前位是否需要进位,需要则将此位变成0,前一位+1,以此类推。还有一个注意的点:首位进位变成10之后也需要进行处理,因为会多一位数字。代码如下:class Solution: def plusOne(self, digits: List[int]) -&g

2021-10-11 15:04:12 219

原创 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

原创 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

原创 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 290

原创 LeetCode第242题:有效的字母异位词(python)

题目:思路:首先判断s和t的长度,不一样直接return false设计两个字典,分别存储s和t的字符以及数量,然后对他们的key进行判断:如果key在字典1却不在字典2,return False如果两个字典都有这个key,但是这个key对应的value(也就是字符的数量)不等,return False代码如下:class Solution: def isAnagram(self, s: str, t: str) -> bool: dic1 = {}

2021-08-19 11:09:27 167

原创 OpenStack保姆级别安装教程

安装步骤OpenStack简介准备工作安装NTP服务安装yum库(所有节点)提前设置一下环境变量安装MySQL安装RabbitMQ安装Menmcached:安装etcd:OpenStack简介OpenStack:是一个开源软件,它提供了开放源码,可以建立公有和私有云,目的在于帮助组织运行虚拟计算或服务存储的云。一般分为四个节点控制节点:对其余节点的控制,包括虚拟机建立,迁移,网络分配等计算节点:负责虚拟机的运行网络节点:负责对外网络与内网络之间的通信存储节点:负责对虚拟机的额外存储管理核心组

2021-08-16 15:06:51 896

原创 LeetCode第383题:赎金信(python)

题目:思路:这里不需要去找ransom中的元素是否在magazine中,可以通过设置两个字典dic1和dic2来判断。dic2中必须要包含dic1中的元素,且dic2元素个数均大于dic1,这样ransom中的元素就一定在magazine中了。代码如下:class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: dic1 = {} dic2 = {}

2021-08-10 10:36:17 179

原创 LeetCode第73题:矩阵置零(python)

题目:思路:可以用标记矩阵的方法对矩阵进行操作,首先单弄出行列标记为False,之后遍历数组,遇到0就转换此处标记为True,遍历完毕之后,在进行一次遍历,把为True的地方换成0就完成了。代码如下:class Solution: def setZeroes(self, matrix: List[List[int]]) -> None: m = len(matrix) n = len(matrix[0]) # 先将行列置位False

2021-08-06 11:06:05 219 3

原创 LeetCode第566题:重塑矩阵(python)

题目:思路:利用两个新的空数组去做,首先设立一个临时存储数组this_nums,和一个汇总数组new_nums,遍历mat的行列,并把mat的每个值按顺序加入到this_nums中,并判断this_nums的长度是否等于给定的列长c,如果等于就把this_nums加入到new_nums中,并清空this_nums。代码如下:class Solution: def matrixReshape(self, mat: List[List[int]], r: int, c: int) ->

2021-08-02 10:07:52 216

原创 LeetCode第121题:买卖股票的最佳时机(python)

题目:思路1:暴力求解,用两层循环,用来寻找最大差值,非常简单(但在LeetCode上大概率出现超时的情况)代码如下:class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) ans = 0 if n == 0: return 0 for i in range(n): for

2021-08-01 19:59:06 249

原创 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 78

原创 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

原创 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

原创 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 98

原创 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

原创 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

原创 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 61

原创 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

原创 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

原创 LeetCode第13题:罗马数字转整数

题目:思路:首先建立字典,把对应的罗马数字与整数写好,之后遍历字符串s,并判断第一个字符的数值与第二个字符的大小,如果小就减去,大就加上,这样就能解决类似于IV这样的情况了。然后是遍历字符串的时候,是从0到len(s)-1,因为每次比大小都是和后一位比,如果遍历到最后一位,就会发生越界的情况。因此最后一位的数值直接加上就好了。代码如下:class Solution: def romanToInt(self, s: str) -> int: example = {

2021-07-15 14:23:50 54

原创 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

原创 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) -&gt

2021-07-14 10:09:29 75

原创 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

原创 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 82

原创 LeetCode第15题:三数之和

思路:这道题可以用很常规的方法去做,由于是判断三个数的和,因此可以先进行一个从小到大的排序,然后固定第一个数(首先保证第一个数不能>0,要不然三个数的和一定是>0的)之后从第二个数开始,让第二个数和最后一个数相加,看是否等于第一个数的相反数,也就是nums[j] + nums[k] == -nums[i]。如果成立则把三个数加入列表。不成立的话,判断j和k的关系,逐步缩小范围,就能取得最终的结果。代码如下:class Solution: def threeSum(self, .

2021-07-07 10:08:37 52

原创 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

原创 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

原创 萌新练习写代码的每日一练:最长回文子串

题目:给你一个字符串 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

原创 萌新练习写代码的每日一练:无重复字符的最长子串

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 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

原创 萌新练习写代码的每日一练:不同路径

题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?思路:题目已经规定了只能向下和向右走,就不需要考虑机器人绕圈的情况了(误使用动态规划,可以先规定这个表格的值,令第一行和第一列为1,其余都为0,也就是下图这个样子之后利用num[i][j] = num[i - 1][j] + num[i][j - 1],也就是说每个位置都是

2021-01-29 16:54:36 159

原创 萌新练习写代码的每日一练:比特位计数

给定一个非负整数 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

原创 萌新练习写代码的每日一练:对链表进行插入排序

题目:对链表进行插入排序示例 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 86

原创 萌新练习写代码的每日一练:删除排序数组中的重复项 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

原创 萌新练习写代码的每日一练:可被 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

原创 萌新练习写代码的每日一练:完全二叉树的节点个数

题目:给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:思路:这道题第一想法就是暴力递归,从根节点开始依次向下搜索左孩子与右孩子,如果有则数量+1,并且在最后的结果也需要+1(因为根节点也要计算进去)代码:# Definition for a binary tree node.# class T

2021-01-12 14:48:42 74

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除