跟着leedcode刷算法 -- 数组5

118 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

image.png

题9

搜索二维矩阵 II

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

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

image.png

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5

输出:true

示例 2:

image.png

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20

输出:false 

提示:

m == matrix.length

n == matrix[i].length

1 <= n, m <= 300

-109 <= matrix[i][j] <= 109

每行的所有元素从左到右升序排列

每列的所有元素从上到下升序排列

-109 <= target <= 109

相关标签

  • 数组
  • 二分查找
  • 分治
  • 矩阵

暴力求解:

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            for m in row:
                if m==target:
                    return True
        return False

执行结果:

image.png

题10

除自身以外数组的乘积

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]

输出: [24,12,8,6]   提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶:

你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

相关标签

  • 数组
  • 前缀和

尝试第一种方法: 虽然可以解题,但是显示超时了,比较慢不符合初衷

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]: 
        def sum_nums(target):
            res= 1
            for row in range(len(nums)):
                if row != target:
                    res = res*nums[row]
            return res
        
        new_nums= []
        for row in range(len(nums)):
            new_nums.append(sum_nums(row))
        return new_nums
        
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]: 
        n = len(nums)
        res = [1]*n
        for i in range(1,n):
            res[i] =  res[i-1]*nums[i-1]
        m = 1
        for i in range(n-1,-1,-1):
            res[i] = res[i]*m
            m*=nums[i]
        return res

image.png