leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)

简介: 时间复杂度:O(q * (m + n) + m * n) 其中q表示 indices 数组的长度,m、n为矩阵的行数和列数,遍历 indices 数组都要更新一次行列,总共需要O(q * (m + n))的时间,最后遍历一次矩阵,总共需要O(m * n)的时间

90a1280241c54191998e7c423be1f4ae.png


题目链接https://leetcode.cn/problems/cells-with-odd-values-in-a-matrix/

思路


方法一、直接模拟


直接想法

直接初始化一个m * n 的二维数组矩阵,遍历 indices 数组中的每对{ri, ci},将矩阵中的第 ri 行都加1,矩阵中的第 ci 列都加1,最后遍历矩阵记录奇数元素的个数


算法


1.初始化一个m * n的二维数组矩阵 matrix


2.遍历 indices 数组的每对{ri, ci}

1)矩阵中的第 ri 行都加1

2)矩阵中的第 ci 列都加1


3.遍历矩阵,得到奇数的数目


代码示例


func oddCells(m, n int, indices [][]int) (ans int) {
    matrix := make([][]int, m)
    for i := range matrix {
        matrix[i] = make([]int, n)
    }
    for _, p := range indices {
        for j := range matrix[p[0]] {
            matrix[p[0]][j]++
        }
        for _, row := range matrix {
            row[p[1]]++
        }
    }
    for _, row := range matrix {
        for _, v := range row {
            ans += v & 1
        }
    }
    return
}

5c43a4f8a20b4814a6f01ca6292d0c99.png


复杂度分析


  • 时间复杂度:O(q * (m + n) + m * n) 其中q表示 indices 数组的长度,m、n为矩阵的行数和列数,遍历 indices 数组都要更新一次行列,总共需要O(q * (m + n))的时间,最后遍历一次矩阵,总共需要O(m * n)的时间


  • 空间复杂度:O(m * n) 其中m、n为矩阵的行数和列数,额外需要申请m * n的空间存放矩阵元素


方法二、模拟空间优化


直接想法


我们每次都需要遍历一整行和一整列,更新一整行和一整列的元素,极大浪费时间,我们可以使用一个row数组和col数组分别记录每一行和每一列增加的次数,我们通过计算(i, j)的位置计数即row[i] + col[j],判断当前位置是否为奇数


算法


1.初始化一个row数组和col数组


2.遍历 indices 数组中的每对{ri, ci}

1)对row[ri]的值加一

2)对col[ci]的值加一


3.遍历m * n的矩阵位置(i, j),计算(i, j)的位置计数即row[i] + col[j]判断奇数


代码示例


func oddCells(m int, n int, indices [][]int) int {
    row := make([]int, m)
    col := make([]int, n)
    for i := range indices{
        row[indices[i][0]] += 1
        col[indices[i][1]] += 1
    }
    ans := 0
    for i := 0; i < m; i++{
        for j := 0; j < n; j++{
            if (row[i] + col[j]) & 1 == 1{
                ans++
            }
        }
    }
    return ans
}

92a55297865e42228546f4b21d892210.png


复杂度分析


  • 时间复杂度:O(q + m * n) 其中q表示 indices 数组的长度,m、n为矩阵的行数和列数遍历 indices 数组都要更新一次 总共需要O(q)的时间,最后遍历一次矩阵,总共需要O(m * n)的时间


  • 空间复杂度:O(m + n) 其中 m, nm,n 为矩阵的行数与列数。需要存储矩阵的行数统计与列数统计
目录
相关文章
|
4月前
|
决策智能
【LeetCode 50】77.组合(优化、剪枝操作)
【LeetCode 50】77.组合(优化、剪枝操作)
37 2
|
6月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
37 4
|
8月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
8月前
|
存储 SQL 算法
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
|
8月前
|
存储 SQL 算法
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
|
8月前
|
算法 数据可视化 数据挖掘
LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )
LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )
LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )
|
7月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
7月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
54 0
|
9月前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
9月前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
73 0