欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++算法實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目

 更新時(shí)間:2022年08月18日 15:34:59   作者:Junkman丶  
這篇文章為大家主要介紹了C++實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目描述

題目鏈接:1252. 奇數(shù)值單元格的數(shù)目

給你一個(gè) m x n 的矩陣,最開始的時(shí)候,每個(gè)單元格中的值都是 0。

另有一個(gè)二維索引數(shù)組 indices,indices[i] = [ri, ci] 指向矩陣中的某個(gè)位置,其中 ri 和 ci 分別表示指定的行和列(從 0 開始編號(hào))。

對(duì) indices[i] 所指向的每個(gè)位置,應(yīng)同時(shí)執(zhí)行下述增量操作:

  • ri 行上的所有單元格,加 1 。
  • ci 列上的所有單元格,加 1 。 給你 m、n 和 indices 。請(qǐng)你在執(zhí)行完所有 indices 指定的增量操作后,返回矩陣中 奇數(shù)值單元格 的數(shù)目。

進(jìn)階: 你可以設(shè)計(jì)一個(gè)時(shí)間復(fù)雜度為 O(n + m + indices.length) 且僅用 O(n + m) 額外空間的算法來解決此問題嗎?

提示:

1 <= m, n <= 50

1 <= indices.length <= 100

0 <= ri < m

0 <= ci < n

示例 1:

輸入:m = 2, n = 3, indices = [[0,1],[1,1]]
輸出:6
解釋:最開始的矩陣是 [[0,0,0],[0,0,0]]。
第一次增量操作后得到 [[1,2,1],[0,1,0]]。
最后的矩陣是 [[1,3,1],[1,3,1]],里面有 6 個(gè)奇數(shù)。

示例 2:

輸入: m = 2, n = 2, indices = [[1,1],[0,0]]
輸出: 0
解釋: 最后的矩陣是 [[2,2],[2,2]],里面沒有奇數(shù)。

整理題意

題目給定一個(gè) m x n 的矩陣,矩陣中每個(gè)元素最開始都為 0,然后給定一個(gè)二維數(shù)組 indices,數(shù)組中每個(gè)元素包含兩個(gè)值 indices[i][0] 和 indices[i][1],分別表示對(duì) m x n 的矩陣的第 indices[i][0] 行和第 indices[i][1] 列進(jìn)行加一操作。

在執(zhí)行完所有 indices 指定的增量操作后,返回矩陣中 奇數(shù)值單元格 的數(shù)目。

需要注意行和列重疊的地方是累計(jì)加的

解題思路分析

觀察題目數(shù)據(jù)范圍較小,采用較為暴力的模擬也是可以通過的,但是我們這里按照進(jìn)階的標(biāo)準(zhǔn)來進(jìn)行解題,時(shí)間復(fù)雜度為 O(n + m + indices.length) 且僅用 O(n + m) 額外空間的算法來解決此問題。

考慮到對(duì)于每一行和每一列來說,如果在 indices 中出現(xiàn)偶數(shù)次那么就相當(dāng)于沒有出現(xiàn),所以我們可以統(tǒng)計(jì)在 indices 中行和列出現(xiàn)奇數(shù)的次數(shù),這里令統(tǒng)計(jì)好的行和列分別記為:

  • 出現(xiàn)奇數(shù)次行的總和為 sumr
  • 出現(xiàn)奇數(shù)次列的總和為 sumc 那么可以通過數(shù)學(xué)計(jì)算的方式來得出最后執(zhí)行完所有 indices 指定的增量操作后,返回矩陣中 奇數(shù)值單元格 的數(shù)目。
  • 因?yàn)閷?duì)于統(tǒng)計(jì)出來出現(xiàn)奇數(shù)次的行和列來說,他們相交的部分為偶數(shù)次,所以只需要減去相交部分的單元格數(shù)量即可,那么最后答案就是 sumr * n + sumc * m - sumr * sumc * 2

為什么要 * 2:是因?yàn)樵?sumr * n 和 sumc * m 的時(shí)候分別加了一次相交的部分,總共就是加了兩次,所以需要 * 2

具體實(shí)現(xiàn)

  • 在統(tǒng)計(jì) indices 中進(jìn)行和列出現(xiàn)是否為奇數(shù)次時(shí),我們可以使用兩個(gè)一維數(shù)組進(jìn)行統(tǒng)計(jì) sr[m] 和 sc[n],分別表示行和列出現(xiàn)的次數(shù)。
  • 因?yàn)槲覀冎恍杞y(tǒng)計(jì)出現(xiàn)奇數(shù)次的行和列,那么我們可以采用異或 ^ 運(yùn)算進(jìn)行優(yōu)化。
  • 最后統(tǒng)計(jì)行和列出現(xiàn)奇數(shù)次的個(gè)數(shù)即可。

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:O(n + m + indices.length),n 和 m 分別為矩陣的長和寬,indices.length 為數(shù)組 indices 的長度。
  • 空間復(fù)雜度:O(n + m),僅需用于保存行和列的一維數(shù)組。

代碼實(shí)現(xiàn)

class Solution {
public:
    int oddCells(int m, int n, vector<vector<int>>& indices) {
        //統(tǒng)計(jì)被加上奇數(shù)次的行和列
        int sr[m], sc[n];
        memset(sr, 0, sizeof(sr));
        memset(sc, 0, sizeof(sc));
        int sumr, sumc;
        sumr = sumc = 0;
        for(auto &v : indices){
            //如果為偶數(shù)次就是 0,奇數(shù)次為 1,用異或來變化0和1
            sr[v[0]] ^= 1;
            //統(tǒng)計(jì)奇數(shù)次的行
            if(sr[v[0]]) sumr++;
            else sumr--;
            sc[v[1]] ^= 1;
            //統(tǒng)計(jì)奇數(shù)次的列
            if(sc[v[1]]) sumc++;
            else sumc--;
        }
        //奇數(shù)次行個(gè)數(shù)加上奇數(shù)次列個(gè)數(shù),減去相交為偶數(shù)次的點(diǎn),因?yàn)榧恿藘杀樗砸?*2
        int ans = sumr * n + sumc * m - sumr * sumc * 2;
        return ans;
    }
};

總結(jié)

  • 該題難點(diǎn)在于如何優(yōu)化時(shí)間復(fù)雜度為 O(n + m + indices.length) 且僅用 O(n + m) 額外空間的算法來解決此問題。
  • 通過統(tǒng)計(jì)行和列出現(xiàn)的次數(shù)便能進(jìn)一步實(shí)現(xiàn)優(yōu)化。核心思想在于計(jì)數(shù)。

測試結(jié)果:

以上就是C++實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解的詳細(xì)內(nèi)容,更多關(guān)于C++奇數(shù)值單元格的數(shù)目的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談Qt信號(hào)槽與事件循環(huán)的關(guān)系

    淺談Qt信號(hào)槽與事件循環(huán)的關(guān)系

    本文主要介紹了Qt信號(hào)槽與事件循環(huán)的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • c++ vector模擬實(shí)現(xiàn)的全過程

    c++ vector模擬實(shí)現(xiàn)的全過程

    這篇文章主要給大家介紹了關(guān)于c++ vector的模擬實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Matlab利用隨機(jī)森林(RF)算法實(shí)現(xiàn)回歸預(yù)測詳解

    Matlab利用隨機(jī)森林(RF)算法實(shí)現(xiàn)回歸預(yù)測詳解

    這篇文章主要為大家詳細(xì)介紹了Matlab如何利用隨機(jī)森林(RF)算法實(shí)現(xiàn)回歸預(yù)測,以及自變量重要性排序的操作,感興趣的小伙伴可以了解一下
    2023-02-02
  • Objective-C中使用STL標(biāo)準(zhǔn)庫Queue隊(duì)列的方法詳解

    Objective-C中使用STL標(biāo)準(zhǔn)庫Queue隊(duì)列的方法詳解

    這篇文章主要介紹了Objective-C中使用STL標(biāo)準(zhǔn)庫Queue隊(duì)列的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • C++日志記錄類實(shí)例解析

    C++日志記錄類實(shí)例解析

    這篇文章主要介紹了C++日志記錄類實(shí)例,代碼功能非常實(shí)用,需要的朋友可以參考下
    2014-07-07
  • C++實(shí)現(xiàn)的求解多元一次方程示例

    C++實(shí)現(xiàn)的求解多元一次方程示例

    這篇文章主要介紹了C++實(shí)現(xiàn)的求解多元一次方程,涉及C++矩陣運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • C語言實(shí)現(xiàn)冒泡排序的思路以及過程

    C語言實(shí)現(xiàn)冒泡排序的思路以及過程

    冒泡排序是最簡單的排序方法,理解起來容易。雖然它的計(jì)算步驟比較多,不是最快的,但它是最基本的,初學(xué)者一定要掌握。本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09
  • VS?Code?C++環(huán)境的搭建過程

    VS?Code?C++環(huán)境的搭建過程

    這篇文章主要介紹了VS?Code?C++環(huán)境的搭建,Somasegar 也告訴筆者這款編輯器也擁有對(duì) Git 的開箱即用的支持,需要的朋友可以參考下
    2022-04-04
  • c++中try catch的用法小結(jié)

    c++中try catch的用法小結(jié)

    這篇文章主要介紹了c++中try catch的用法小結(jié),需要的朋友可以參考下
    2018-01-01
  • C++從匯編的視角審視對(duì)象的創(chuàng)建問題

    C++從匯編的視角審視對(duì)象的創(chuàng)建問題

    這篇文章主要介紹了C++從匯編的視角看對(duì)象的創(chuàng)建,從匯編的視角來看,調(diào)用構(gòu)造器和調(diào)用 “返回對(duì)象” 的函數(shù)是一樣的,從匯編的角度來看,對(duì)象就是一堆數(shù)據(jù)的排列,比如說最普通的對(duì)象就是數(shù)據(jù)成員按照聲明順序直接排列,需要的朋友可以參考下
    2022-01-01

最新評(píng)論