数组和字符串小册部分题目记录——
1.合并区间,用一个新的二维数组merged存结果,如果merged为空或区间没有重叠(merged最后一个元素的右边界<intervals元素们的左边界)就加入结果集,否则更新merged最后一个元素的边界
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
"""
# 排序
intervals = sorted(intervals, key = lambda x: x[0])
merged = []
for interval in intervals:
if merged==[] or merged[-1][1]<interval[0]: #当为空或区间没有重复时
merged.append(interval) # 加入
else: # 否则更新最新的区间右边界
merged[-1][1] = max(interval[1], merged[-1][1])
return merged
# print(Solution().merge([[1,3],[2,6],[8,10],[15,18]])) 测试数据
我的办法太笨了!!!!还是没有接触到问题本质,故不贴原代码,学习示例
2.零矩阵,把有0的行和列其他元素也转为0
import numpy as np
class Solution(object):
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: None Do not return anything, modify matrix in-place instead.
"""
list_matrix = np.array(matrix)
for i in range(len(matrix)):
for j in range(len(matrix[i])):
a = list_matrix[i][j] # 转成ndarray进行数组操作
if matrix[i][j] == 0:
list_matrix[i, :] = 0
list_matrix[:, j] = 0
matrix = list_matrix
return matrix
# 结果都对的不知道为啥到lc就不一样了
应该是被禁用numpy了、、学学官方的
class Solution:
def setZeroes(self, matrix):
m, n = len(matrix), len(matrix[0])
row, col = [False] * m, [False] * n
# 用布尔值做标签!!方便后续判断 同时也降维了
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
row[i] = True # 给行打标签
col[j] = True # 给列打标签
for i in range(m):
for j in range(n):
if row[i] or col[j]: # 置零
matrix[i][j] = 0
print(matrix)
3.遍历对角线
开始给我看迷糊了。。。总之是分类(向上遍历、向下遍历)找规律;从对角线第一个元素入手,再分类讨论在第一行/列和不在第一列的第一个元素的位置。结合画图、写坐标理解
class Solution:
def findDiagonalOrder(self, mat):
ans = []
m, n = len(mat), len(mat[0]) # m是行数,n是列数,i表示第几次遍历(第几条对角线)
for i in range(m + n - 1): # 看对角线第一个值确定有几条对角线
if i % 2: # 奇数向下遍历
x = 0 if i < n else i - n + 1 # 如果不是第一行则-列数+1
y = i if i < n else n - 1 # 如果不是第一行则-1
while x < m and y >= 0:
ans.append(mat[x][y])
x += 1
y -= 1
else: # 偶数向上遍历
# 三元表达式,i<m,x=i 否则x=m-1
x = i if i < m else m - 1 # 从第一列开始遍历,如果不在第一列就从最后一行开始遍历
y = 0 if i < m else i - m + 1 # 如果不在第一列则-行数+1
while x >= 0 and y < n: # 开始向上遍历,
ans.append(mat[x][y])
x -= 1
y += 1
return ans
4.找最大前缀,可以用横向比较和纵向比较。此处为纵向比较,第一个字符串与其他字符串一一比较字符,直到比到有不同的字符跳出循环,返回位置
(是简单题又怎样,还是不会。。。)
class Solution:
def longestCommonPrefix(self, strs):
if not strs: # 空字符返回""
return ""
length, count = len(strs[0]), len(strs)
for i in range(length):
c = strs[0][i] # 都跟第一个字符串比较
if any(i == len(strs[j]) or strs[j][i] != c for j in range(1, count)): # 同列比较
# j指除去第一个之外的字符串 i == len(strs[j]可以看做ture
return strs[0][:i]
return strs[0]