• 知识储备--基础算法篇-矩阵


    2.矩阵

    2.1第54题螺旋矩阵

    第一题上来就跪了,看了官方答案感觉不是很好理解,找了一个比较容易理解的。

    1. class Solution(object):
    2. def spiralOrder(self, matrix):
    3. """
    4. :type matrix: List[List[int]]
    5. :rtype: List[int]
    6. """
    7. m = len(matrix)
    8. n = len(matrix[0])
    9. result = []
    10. left = 0
    11. right = n-1
    12. top = 0
    13. bottom = m-1
    14. nums = m*n
    15. while nums >= 1:
    16. i = left
    17. while i <= right and nums >= 1:
    18. result.append(matrix[top][i])
    19. nums = nums - 1
    20. i = i + 1
    21. top = top + 1
    22. i = top
    23. while i <= bottom and nums >= 1:
    24. result.append(matrix[i][right])
    25. nums = nums - 1
    26. i = i + 1
    27. right = right - 1
    28. i = right
    29. while i >= left and nums >= 1:
    30. result.append(matrix[bottom][i])
    31. nums = nums - 1
    32. i = i - 1
    33. bottom = bottom - 1
    34. i = bottom
    35. while i >= top and nums >= 1:
    36. result.append(matrix[i][left])
    37. nums = nums - 1
    38. i = i - 1
    39. left = left + 1
    40. return result

    还有一个暴力方法,其中有几个知识点,

    • list的[]中有三个参数,用冒号分割
    • list[param1:param2:param3]
    • param1,相当于start_index,可以为空,默认是0
    • param2,相当于end_index,可以为空,默认是list.size
    • param3,步长,默认为1。步长为-1时,返回倒序原序列

    技巧:使用zip(*matrix)

    代码:这里*解包,zip压缩,zip后变成zip类型,zip会把原有矩阵从第一列开始,把每一列打包成一个元祖,把元祖强转为list达到矩阵转置的效果。

    但是实现顺时针旋转效果还需要配合[::-1]使用,先把行调换,第一行与最后一行换,然后再矩阵转置,达到矩阵旋转的效果。

    1. class Solution(object):
    2. def spiralOrder(self, matrix):
    3. """
    4. :type matrix: List[List[int]]
    5. :rtype: List[int]
    6. """
    7. res = []
    8. while matrix:
    9. # 删除第一行并返回
    10. res += matrix.pop(0)
    11. # 矩阵转置
    12. matrix = list(zip(*matrix))
    13. # 行调换,如第一行与最后一行换
    14. matrix = matrix[::-1]
    15. return res

    2.2第73题-矩阵置零

    第二道题还是比较简单的,获得0元素的行列索引,将其存到字典中,如果有重复的就不管,最后遍历字典的key,将指定的行列都置0就行了。

    1. class Solution(object):
    2. def setZeroes(self, matrix):
    3. """
    4. :type matrix: List[List[int]]
    5. :rtype: None Do not return anything, modify matrix in-place instead.
    6. """
    7. m = len(matrix)
    8. n = len(matrix[0])
    9. hang = {}
    10. lie = {}
    11. for i in range(m):
    12. for j in range(n):
    13. if matrix[i][j]==0:
    14. if i not in hang:
    15. hang[i] = 1
    16. if j not in lie:
    17. lie[j] = 1
    18. for i in hang:
    19. for j in range(n):
    20. matrix[i][j] = 0
    21. for i in lie:
    22. for j in range(m):
    23. matrix[j][i] = 0

    2.3第48题-旋转图像

    给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

    你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

    示例 1:

    直接用刚学会的矩阵转置来做,飞快,就是内存用的多。

    1. class Solution(object):
    2. def rotate(self, matrix):
    3. """
    4. :type matrix: List[List[int]]
    5. :rtype: None Do not return anything, modify matrix in-place instead.
    6. """
    7. # 直接用转置
    8. # 先颠倒,再转置
    9. matrix[:] = matrix[::-1]
    10. matrix[:] = list(zip(*matrix))

    用常规方法,第i行的第x个元素(列)移动到第m-i-1列的第x个位置(行)

    1. class Solution(object):
    2. def rotate(self, matrix):
    3. """
    4. :type matrix: List[List[int]]
    5. :rtype: None Do not return anything, modify matrix in-place instead.
    6. """
    7. matrix2 = copy.deepcopy(matrix)
    8. m = len(matrix)
    9. for i in range(m):
    10. for j in range(m):
    11. matrix[j][m-1-i] = matrix2[i][j]

    2.4第240题搜索二维矩阵

    编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

    • 每行的元素从左到右升序排列。
    • 每列的元素从上到下升序排列。

    示例 1:

    1. class Solution(object):
    2. def searchMatrix(self, matrix, target):
    3. """
    4. :type matrix: List[List[int]]
    5. :type target: int
    6. :rtype: bool
    7. """
    8. # 对角线上的元素是左上角块的最大值,只需要确定target的范围,
    9. # 找到比target小的对应行列就可以了
    10. # 比如target=14,先确定范围,>1,>5,>9,<17
    11. # 这时候就可以在元素17对应的左边和上边遍历寻找了
    12. # 如果m!=n,则先寻找对角线,再寻找剩下几列
    13. max_ = []
    14. m = len(matrix)
    15. n = len(matrix[0])
    16. a = min(m,n)
    17. flag = False
    18. for i in range(a):
    19. max_.append(matrix[i][i])
    20. b = 0
    21. c = 0
    22. d = 0
    23. for i in range(a):
    24. if target < max_[i]:
    25. b = i-1
    26. break
    27. elif target==max_[i]:
    28. return True
    29. for i in range(b+1,n):
    30. if target < matrix[b][i]:
    31. c = i
    32. break
    33. elif target == matrix[b][i]:
    34. return True
    35. for i in range(b+1,m):
    36. if target < matrix[i][b]:
    37. d = i
    38. break
    39. elif target == matrix[i][b]:
    40. return True
    41. for j in range(c,n):
    42. for i in range(b):
    43. if matrix[i][j] == target:
    44. return True
    45. for j in range(d,m):
    46. for i in range(b):
    47. if matrix[j][i] == target:
    48. return True

    看了答案,发现从右上角慢慢缩小范围就可以了,妈的,这没想到。

    1. class Solution(object):
    2. def searchMatrix(self, matrix, target):
    3. """
    4. :type matrix: List[List[int]]
    5. :type target: int
    6. :rtype: bool
    7. """
    8. m = len(matrix)
    9. n = len(matrix[0])
    10. x = 0
    11. y = n-1
    12. while xand y>=0:
    13. if matrix[x][y]==target:
    14. return True
    15. elif matrix[x][y] < target:
    16. x = x + 1
    17. else:
    18. y = y - 1

  • 相关阅读:
    白酒:中国的酒文化的传承与发扬
    1.性能优化
    JS-基础
    Eureka介绍与使用
    vue+echarts项目十二:使用webSocket优化项目:合并图表到一个页面并添加 切换主题和切换全屏功能
    HTML+CSS+Jquery实现北大官网所有效果
    文件上传预览下载
    expect自动化交互应用程序工具
    SpringBoot项目启动的时候直接退出了?
    高项_第十章项目沟通管理
  • 原文地址:https://blog.csdn.net/Orange_sparkle/article/details/132639111