继续leetcode刷题生涯
这里记录的都是笔者觉得有点意思的做法
参考了好几位大佬的题解,尤其是powcai大佬和labuladong大佬,感谢各位大佬
# 二分 局部最大
class Solution(object):
def findPeakElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] < nums[mid + 1]:
l = mid + 1
else:
r = mid
return l
# 桶排序
class Solution(object):
def maximumGap(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n <= 1: return 0
max_num = max(nums)
min_num = min(nums)
import math
gap = math.ceil((max_num - min_num) / (n - 1))
bucket = [[float("inf"), float("-inf")] for _ in range(n-1)]
for i in nums:
if i == max_num or i == min_num:
continue
loc = (i - min_num) // gap
bucket[loc][0] = min(i, bucket[loc][0])
bucket[loc][1] = max(i, bucket[loc][1])
premin = min_num
res = float("-inf")
for x, y in bucket:
if x == float("inf"):
continue
res = max(res, x - premin)
premin = y
res = max(res, max_num - premin)
return res
class Solution(object):
def compareVersion(self, version1, version2):
"""
:type version1: str
:type version2: str
:rtype: int
"""
import itertools
l1, l2 = version1.split("."), version2.split(".")
for x, y in itertools.zip_longest(l1, l2, fillvalue=0):
if int(x) != int(y):
if int(x) > int(y):
return 1
else:
return -1
return 0
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
if numerator == 0: return "0"
res = []
if (numerator > 0) ^ (denominator > 0):
res.append("-")
numerator, denominator = abs(numerator), abs(denominator)
a, b = divmod(numerator, denominator)
res.append(str(a))
if b == 0:
return "".join(res)
res.append(".")
loc = {b:len(res)}
while b:
b *= 10
a, b = divmod(b, denominator)
res.append(str(a))
if b in loc:
res.insert(loc[b], "(")
res.append(")")
break
loc[b] = len(res)
return "".join(res)
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
l, r = 0 ,len(numbers) - 1
while l < r:
res = numbers[l] + numbers[r]
if res == target:
return [l+1, r+1]
elif res > target:
r -= 1
else:
l += 1
# 10进制转换26进制
class Solution:
def convertToTitle(self, n: int) -> str:
res = ""
while n:
n -= 1
n, y = divmod(n, 26)
res = chr(y + 65) + res
return res
# 递归
class Solution:
def convertToTitle(self, n: int) -> str:
return "" if n == 0 else self.convertToTitle((n - 1) // 26) + chr((n - 1) % 26 + 65)
# 排序中位数
class Solution:
def majorityElement(self, nums: List[int]) -> int:
return sorted(nums)[len(nums)//2]
# 计数
class Solution:
def majorityElement(self, nums: List[int]) -> int:
return sorted(collections.Counter(nums).items(), key = lambda x:x[1])[-1][0]