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 = 0right = xwhile left <= right:mid = left + (right - left) // 2if mid**2 == x:return midelif mid**2 < x:res = midleft = mid + 1elif mid**2 > x:right = mid - 1return res
3. 70——爬楼梯
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
标签:记忆化搜索,数学,动态规划
代码:
class Solution:def climbStairs(self, n: int) -> int:dp = [0] * nfor i in range(n):if i == 0:dp[i] = 1elif i == 1:dp[i] = 2else: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 == "":continueelif 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 = 0right = len(nums) - 1while left <= right:mid = left + (right - left) // 2if nums[mid] == target:return Trueelif nums[mid] < target:left = mid + 1elif nums[mid] > target:right = mid - 1return 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 = 0fast = 0while fast < len(nums):if nums[fast] == 0:nums[slow], nums[fast] = nums[fast], nums[slow]slow = slow + 1fast = fast + 1fast = slowwhile fast < len(nums):if nums[fast] == 1:nums[slow], nums[fast] = nums[fast], nums[slow]slow = slow + 1fast = fast + 1