1. 68——文本左右对齐
给定一个单词数组 words
和一个长度 maxWidth
,重新排版单词,使其成为每行恰好有 maxWidth
个字符,且左右两端对齐的文本。
你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' '
填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
注意:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组
words
至少包含一个单词。
标签:数组,字符串,模拟(目前不会)
代码:
2. 69——x的平方根
给你一个非负整数 x
,计算并返回 x
的算术平方根。
由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
标签:数学,二分查找
代码:
class Solution:
def mySqrt(self, x: int) -> int:
left = 0
right = x
while left <= right:
mid = left + (right - left) // 2
if mid**2 == x:
return mid
elif mid**2 < x:
res = mid
left = mid + 1
elif mid**2 > x:
right = mid - 1
return res
3. 70——爬楼梯
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
标签:记忆化搜索,数学,动态规划
代码:
class Solution:
def climbStairs(self, n: int) -> int:
dp = [0] * n
for i in range(n):
if i == 0:
dp[i] = 1
elif i == 1:
dp[i] = 2
else:
dp[i] = dp[i-1] + dp[i-2]
return dp[n-1]
4. 71——简化路径
给你一个字符串 path
,表示指向某一文件或目录的 Unix 风格绝对路径(以 '/'
开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//'
)都被视为单个斜杠 '/'
。 对于此问题,任何其他格式的点(例如,'...'
)均被视为文件/目录名称。
请注意,返回的规范路径必须遵循下述格式:
- 始终以斜杠
'/'
开头。 - 两个目录名之间必须只有一个斜杠
'/'
。 - 最后一个目录名(如果存在)不能以
'/'
结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'
或'..'
)。
返回简化后得到的规范路径。
标签:栈,字符串
代码:
class Solution:
def simplifyPath(self, path: str) -> str:
stack = []
paths = path.split("/")
for i in paths:
if i == "." or i == "":
continue
elif i == "..":
if stack:
stack.pop()
else:
stack.append(i)
path = "/" + "/".join(stack)
return path
5. 72——编辑距离
给你两个单词 word1
和 word2
, 请返回将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
标签:字符串,动态规划(目前不会)
代码:
6. 73——矩阵置零
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。
标签:数组,哈希表,矩阵
代码:
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m = len(matrix)
n =len(matrix[0])
hang = []
lie = []
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
hang.append(i)
lie.append(j)
for i in range(m):
for j in range(n):
if i in hang or j in lie:
matrix[i][j] = 0
7. 74——搜索二维矩阵
给你一个满足下述两条属性的 m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target
,如果 target
在矩阵中,返回 true
;否则,返回 false
。
标签:数组,二分查找,矩阵
代码:
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m = len(matrix)
nums = []
for i in range(m):
nums = nums + matrix[i]
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return True
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return False
8. 75——颜色分类
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
标签:数组,双指针,排序
代码:
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
slow = 0
fast = 0
while fast < len(nums):
if nums[fast] == 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow = slow + 1
fast = fast + 1
fast = slow
while fast < len(nums):
if nums[fast] == 1:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow = slow + 1
fast = fast + 1