算法刷题
代码与思路齐飞
这个作者很懒,什么都没留下…
展开
-
575、分糖果
解题思路从题意可知,一人最多分一半的糖果,这样即使有大于一半的种类,也只能得到一半的种类。如果达不到一半的种类,则每个种类要获取一个,这样才能满足最大种类。用set得到总的种类,然后与能得到的最大种类(一半)比较,如果大于,则最多获取一半的种类,否则获取总的种类。代码class Solution: def distributeCandies(self, candyType: List[int]) -> int: maxtype = len(candyType)原创 2021-11-01 09:32:44 · 4531 阅读 · 1 评论 -
260、只出现一次的数字II
1、位与异或根据相同数异或为零以及零与任何数异或仍是其本身的性质,可以得到两个只出现一次数字的异或值,且两个数的二进制位中必然有一位是不相同的,因为其不能为0。将列表中的值遍历与其中低位第一个为1的数进行与运算,可以将其分为两组。将两组分别进行异或,最后得到两个只出现一次的数字。低位第一个为1的位数可以通过其与其反值进行与运算得到。代码class Solution: def singleNumber(self, nums: List[int]) -> List[int]原创 2021-10-31 14:10:44 · 3610 阅读 · 0 评论 -
496、下一个更大元素
解题思路既然要找元素后面更大的元素,如果从nums1遍历找,我们不知道nums1中元素在nums2中的位置,所以直接从nums2遍历查找,另外需要一个临时列表存放未找到更大值的元素以及一个字典存放元素及其对应最大值。如果当前列表中值小于遍历值,将其与遍历值存入字典,然后移除,不断循环。否则将遍历值存入列表,进行下一次比较。最后遍历nums1,通过字典找到其对应的最大值。代码class Solution: def nextGreaterElement(self, nums1: Lis原创 2021-10-26 12:02:57 · 2816 阅读 · 0 评论 -
240、搜索二维矩阵II
1.暴力破解这种就是一个个比较矩阵中的值与目标值,相等返回True;否则返回False。代码class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: for row in matrix: for v in row: if v == target: retur原创 2021-10-26 10:52:25 · 150 阅读 · 0 评论 -
492、构造矩形
1、遍历判断遍历1到area,判断整除后的数是否大于当前数,如果是,判断两者之差是否为最小;如果不大于当前数,返回结果。代码class Solution: def constructRectangle(self, area: int) -> List[int]: diff = area minlength, minwide = 0,0 for wide in range(1, area+1, 1): leng原创 2021-10-23 09:15:37 · 109 阅读 · 0 评论 -
229、求众数II
1、使用字典遍历列表,将每个不同的元素存入字典,如果已经在字典中,则加1;最后判断哪个元素的次数大于n/3。代码class Solution: def majorityElement(self, nums: List[int]) -> List[int]: total_dict = {} length = len(nums) for i in range(length): if nums[i] in to..原创 2021-10-23 08:18:11 · 98 阅读 · 0 评论 -
136、只出现一次的数字
1、遍历筛选遍历列表,如果没有在临时列表中,添加到临时列表中;如果出现在临时列表中,移除临时列表中相应的值,此步骤耗时多。最后临时列表剩下的就是只出现一次的数字。代码class Solution: def singleNumber(self, nums: List[int]) -> int: total = [] for i in range(len(nums)): if nums[i] in total:原创 2021-10-21 14:09:33 · 90 阅读 · 0 评论 -
121、买卖股票的最佳时机
解题思路此题如果换种说法,应该是找出列表中递增子序列中最大值与最小值之间差的最大值。那就从列表0出发,不断与0位置的数进行比较,如果大于的话,就不断比较利润值;直到找到下一个比0位置小的数,开始计算这个递增子序列的利润值,比较利润值,直到列表最后一个元素。如果感到难理解,可以这么想,如果后面还有更大的值,那么如果有一个元素比当前元素小,那么这个元素与那个更大值的差,比当前元素与那个更大值的差,更大。代码class Solution: def maxProfit(self, pric原创 2021-10-21 12:14:32 · 86 阅读 · 0 评论 -
58、最后一个单词的长度
1、使用内置函数直接使用python内置函数,首先用strip去除首尾空格,然后进行分割,得到全是字符串的列表,最后一个列表元素的长度就是最后一个的单词的长度。class Solution: def lengthOfLastWord(self, s: str) -> int: new_s = s.strip().split(" ") return len(new_s[-1])2、使用倒序遍历计算使用倒序遍历计算,从字符串末尾开始遍历,为空格时,原创 2021-10-21 10:52:01 · 101 阅读 · 0 评论 -
125、验证回文串
1、 解题思路1.首先将字母转换为统一格式2.遍历字符串,如果是字母或数字,加入列表3.将添加完的列表进行反转,然后与原列表比较,得出结果官方的这个思路和我的一样,直接用字符串,比我的简洁。class Solution: def isPalindrome(self, s: str) -> bool: letters = [] s = s.lower() for i in s: if i.isalpha()原创 2021-10-21 10:21:03 · 67 阅读 · 0 评论 -
66、加一
解题思路加1是在最后一位加1,如果最后一位为9,就会向前进位;如果前面一位还是9,继续向前进位;如果不为9,就会停止。所以从列表最后一位开始向前判断,如果加上1小于10,循环停止,即为最后结果;极端情况是全为9,此时会不断进位,在循环结束时,在列表索引0处插入1即可。代码class Solution: def plusOne(self, digits: List[int]) -> List[int]: flag = 1 for i in range原创 2021-10-21 08:44:56 · 91 阅读 · 0 评论 -
453. 最小操作次数使数组元素相等
1、逆向思考n-1个数加1相当于1个数减1,操作一定次数后,n个数相等,即所有数减1直到所有数都为最小值,所以可以得出公式为n个数的和,减去最小值乘以n。操作次数m = n个数的和 - 最小值min_val * 数组长度n。2、数学计算假设操作了m次,则增加了m * (n-1);假设经过m次操作后,相同的数为x,则操作后的总和为n * x;假设操作前的总和为sum;即可以得出:n * x=m * (n-1)+sum;a经过m次操作,最小值变成x,一共增加了m,假设最小值为m...原创 2021-10-20 11:12:25 · 350 阅读 · 0 评论 -
231. 2的幂
1.解题思路第一种最棒的方法,是运用位运算。我自己使用的是n右移一位后与n-1做与运算,不变得返回true;官方的两种是n与n-1做与运算,结果为0的返回true;n与补码做与运算,结果与n相同的返回true。class Solution: def isPowerOfTwo(self, n: int) -> bool: return n > 0 and (n&(n-1))==02.解题思路第二种使用循...原创 2021-10-19 11:35:36 · 84 阅读 · 0 评论