1.转置矩阵
给你一个二维整数数组 matrix
, 返回 matrix
的 转置矩阵 。
矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。
解题思路
第一个想法就是直接获取到矩阵各个元素的行索引和列索引,直接进行交换就行了,但是不太会直接在原矩阵上操作,于是又新建了个列表直接将原矩阵的行作为列,列作为行,并使用原矩阵中的元素赋值
代码实现
class Solution:
def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
re_matrix = []
for row in range(len(matrix[0][:])):
row_temp = []
for col in range(len(matrix)):
row_temp.append(matrix[col][row])
re_matrix.append(row_temp)
return re_matrix
看了眼官方题解,思路是一样的,不过可以使用原矩阵的形状对转换后的数组初始化,可以省一个临时变量的空间
class Solution:
def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
re_matrix = [[0] * len(matrix) for _ in le(matrix[0])]
for row in range(len(matrix[0])):
for col in range(len(matrix)):
re_matrix[row][col] == matrix[col][row]
return re_matrix
复杂度分析
时间复杂度O(n)(n为矩阵元素个数),空间复杂度O(1)
2.分割字符串的最大得分
给你一个由若干 0 和 1 组成的字符串 s
,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。
「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。
解题思路
顺着题意容易想到遍历整个字符串将每种组合的得分都算出来,然后得出最大的得分,但是这种方法时间复杂度达到了O(n2)。换种思路,当我们从右子字符串中移除字符,并添加到左子字符串中时,我们只需要知道变化的字符是“0”还是“1”,便可以知道整体得分的变化,而这种方法只需要遍历两次字符串
代码实现
第一种
def maxScore(self, s: str) -> int:
return max(s[:i].count('0') + s[i:].count('1') for i in range(1, len(s)))
第二种
class Solution:
def maxScore(self, s: str) -> int:
ans = score = (s[0] == '0') + s[1:].count('1')
for c in s[1:-1]:
score += 1 if c == '0' else -1
ans = max(ans, score)
return ans
复杂度分析
第一种时间复杂度为O(n2),空间复杂度为O(1)
第二种时间复杂度为O(n),空间复杂度为O(1)
3.统计范围内元音字符串数
给你一个下标从 0 开始的字符串数组 words
和两个整数:left
和 right
。
如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 'a'
、'e'
、'i'
、'o'
、'u'
。
返回 words[i]
是元音字符串的数目,其中 i
在闭区间 [left, right]
内。
解题思路
暴力解就完事了
代码实现
注意应该把列表换为集合(set),提高运行效率
class Solution:
def vowelStrings(self, words: List[str], left: int, right: int) -> int:
def isVowel(char):
if char in ["a", "o", "e", "i", "u"]:
return True
else:
return False
sum = 0
for i in range(left, right + 1):
if isVowel(words[i][0]) and isVowel(words[i][len(words[i]) - 1]):
sum += 1
return sum
复杂度分析
时间O(n+a),空间O(a)
4.山脉数组的峰顶索引
符合下列属性的数组 arr
称为 山脉数组 :
arr.length >= 3
- 存在
i
(0 < i < arr.length - 1
)使得:arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的山脉数组 arr
,返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
的下标 i
。
你必须设计并实现时间复杂度为 O(log(n))
的解决方案。
解题思路
二分法秒了
代码实现
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
left = 0
right = len(arr) - 1
while left != right:
mid = (left + right) // 2
if arr[mid] == max(arr[mid], arr[mid-1], arr[mid+1]):
return mid
elif arr[mid] < arr[mid - 1]:
right = mid
else:
left = mid
复杂度分析
时间O(log n),空间O(1)