最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java算法Leecode刷題統(tǒng)計有序矩陣中的負(fù)數(shù)

 更新時間:2022年10月08日 16:23:45   作者:可口可鹽  
這篇文章主要為大家介紹了java算法Leecode刷題統(tǒng)計有序矩陣中的負(fù)數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

leecode 1351. 統(tǒng)計有序矩陣中的負(fù)數(shù)

【Java 刷題打卡】

那就干吧! 這個專欄都是刷的題目都是關(guān)于二分法的,我會由淺入深、循序漸進(jìn),刷題就是這樣需要連續(xù)不斷的記憶--艾賓浩斯記憶法2121112。二分法的內(nèi)容不多,但是都是每個程序員必備的

給你一個 m * n 的矩陣 grid,矩陣中的元素?zé)o論是按行還是按列,都以非遞增順序排列。 

請你統(tǒng)計并返回 grid 中 負(fù)數(shù) 的數(shù)目。

示例 1

輸入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
輸出:8
解釋:矩陣中共有 8 個負(fù)數(shù)。
示例 2:

輸入:grid = [[3,2],[1,0]]
輸出:0
示例 3:

輸入:grid = [[1,-1],[-1,-1]]
輸出:3
示例 4:

輸入:grid = [[-1]]
輸出:1

提示

m == grid.length
n == grid[i].length
1 <= m, n <= 100
-100 <= grid[i][j] <= 100

進(jìn)階:你可以設(shè)計一個時間復(fù)雜度為 O(n + m) 的解決方案嗎?

Morris 遍歷算法整體步驟如下(假設(shè)當(dāng)前遍歷到的節(jié)點(diǎn)為 x):

如果 x 無左孩子,則訪問 x 的右孩子,即 x = x.right。

如果 x 有左孩子,則找到 x 左子樹上最右的節(jié)點(diǎn)(即左子樹中序遍歷的最后一個節(jié)點(diǎn),x 在中序遍歷中的前驅(qū)節(jié)點(diǎn)),我們記為 predecessor(前任)。根據(jù)predecessor 的右孩子是否為空,進(jìn)行如下操作。

  • 如果predecessor 的右孩子為空,則將其右孩子指向 x,然后訪問 x 的左孩子,即 x = x.left。
  • 如果 predecessor 的右孩子不為空,則此時其右孩子指向 x,說明我們已經(jīng)遍歷完 x 的左子樹,我們將 predecessor 的右孩子置空,然后訪問 x 的右孩子,即 x = x.right。

重復(fù)上述操作,直至訪問完整棵樹。

其實(shí)整個過程我們就多做一步:將當(dāng)前節(jié)點(diǎn)左子樹中最右邊的節(jié)點(diǎn)指向它,這樣在左子樹遍歷完成后我們通過這個指向走回了 x,且能再通過這個知曉我們已經(jīng)遍歷完成了左子樹,而不用再通過棧來維護(hù),省去了棧的空間復(fù)雜度。

了解完這個算法以后,其他地方與方法二并無不同,我們同樣也是維護(hù)一個 pred 變量去比較即可,具體實(shí)現(xiàn)可以看下面的代碼,這里不再贅述。

參考代碼

定義一顆樹

class TreeNode {
    int val;          // 頭結(jié)點(diǎn)
    TreeNode left;    // 左子樹
    TreeNode right;   // 右子樹
    TreeNode(int x) {
        val = x;
    }
}
// 測試方法
 public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1);
        treeNode.left = new TreeNode(2);
        treeNode.right = new TreeNode(3);
        System.out.println("xxxx結(jié)果 = " + preorderTraversal(treeNode));
}        

JAVA Morris

class Solution {
    public void recoverTree(TreeNode root) {
        TreeNode x = null, y = null, pred = null, predecessor = null;
        while (root != null) {
            if (root.left != null) {
                // predecessor 節(jié)點(diǎn)就是當(dāng)前 root 節(jié)點(diǎn)向左走一步,然后一直向右走至無法走為止
                predecessor = root.left;
                while (predecessor.right != null && predecessor.right != root) {
                    predecessor = predecessor.right;
                }
                // 讓 predecessor 的右指針指向 root,繼續(xù)遍歷左子樹
                if (predecessor.right == null) {
                    predecessor.right = root;
                    root = root.left;
                }
                // 說明左子樹已經(jīng)訪問完了,我們需要斷開鏈接
                else {
                    if (pred != null && root.val < pred.val) {
                        y = root;
                        if (x == null) {
                            x = pred;
                        }
                    }
                    pred = root;
                    predecessor.right = null;
                    root = root.right;
                }
            }
            // 如果沒有左孩子,則直接訪問右孩子
            else {
                if (pred != null && root.val < pred.val) {
                    y = root;
                    if (x == null) {
                        x = pred;
                    }
                }
                pred = root;
                root = root.right;
            }
        }
        swap(x, y);
    }
    public void swap(TreeNode x, TreeNode y) {
        int tmp = x.val;
        x.val = y.val;
        y.val = tmp;
    }
}

以上就是java算法Leecode刷題統(tǒng)計有序矩陣中的負(fù)數(shù)的詳細(xì)內(nèi)容,更多關(guān)于java算法統(tǒng)計有序矩陣負(fù)數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)excel自定義樣式與字段導(dǎo)出詳細(xì)圖文教程

    java實(shí)現(xiàn)excel自定義樣式與字段導(dǎo)出詳細(xì)圖文教程

    最近接到一個需求,客戶不滿意原本導(dǎo)出的csv文件,想要導(dǎo)出Excel文件,下面這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)excel自定義樣式與字段導(dǎo)出詳細(xì)圖文教程
    2023-09-09
  • SpringBoot登錄驗(yàn)證碼實(shí)現(xiàn)過程詳解

    SpringBoot登錄驗(yàn)證碼實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了SpringBoot登錄驗(yàn)證碼實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • java中金額元轉(zhuǎn)萬元工具類的實(shí)例

    java中金額元轉(zhuǎn)萬元工具類的實(shí)例

    這篇文章主要介紹了java中金額元轉(zhuǎn)萬元工具類的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • C++ 歸并排序(merge sort)案例詳解

    C++ 歸并排序(merge sort)案例詳解

    這篇文章主要介紹了C++ 歸并排序(merge sort)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • IDEA使用MyBatisCodeHelperPro來generator代碼的詳細(xì)教程

    IDEA使用MyBatisCodeHelperPro來generator代碼的詳細(xì)教程

    這篇文章主要介紹了IDEA使用MyBatisCodeHelperPro來generator代碼的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • MyBatis-plus實(shí)現(xiàn)逆向生成器

    MyBatis-plus實(shí)現(xiàn)逆向生成器

    本文主要介紹了MyBatis-plus實(shí)現(xiàn)逆向生成器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 解決grails服務(wù)端口沖突的辦法(grails修改端口號)

    解決grails服務(wù)端口沖突的辦法(grails修改端口號)

    grails中默認(rèn)的服務(wù)端口為8080,當(dāng)本機(jī)中需要同時啟動兩個不同的項目時,就會造成端口沖突,下面給出解決方法
    2013-12-12
  • SpringBoot如何處理@KafkaListener消息

    SpringBoot如何處理@KafkaListener消息

    Spring通過KafkaMessageListenerContainer、ConcurrentMessageListenerContainer等組件實(shí)現(xiàn)Kafka消息的監(jiān)聽和處理,并通過@KafkaListener注解將業(yè)務(wù)邏輯與Kafka消費(fèi)者連接起來,Spring?Boot自動配置Kafka相關(guān)組件,簡化了Kafka的使用
    2024-12-12
  • SpringCloud如何搭建一個多模塊項目

    SpringCloud如何搭建一個多模塊項目

    這篇文章主要介紹了SpringCloud如何搭建一個多模塊項目,記錄下使用SpringCloud創(chuàng)建多模塊項目,一步一步記錄搭建的過程,感興趣的可以了解一下
    2021-05-05
  • jfinal添加jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法

    jfinal添加jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法

    這篇文章主要介紹了jfinal的jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法,大家參考使用吧
    2014-01-01

最新評論

体育| 云龙县| 台北市| 永靖县| 托克托县| 余干县| 河西区| 南康市| 炉霍县| 鲁山县| 南京市| 吴堡县| 岳西县| 剑河县| 舒城县| 曲松县| 漳浦县| 灵寿县| 收藏| 滨州市| 甘泉县| 阿拉善盟| 南涧| 镇江市| 沛县| 平潭县| 运城市| 宣城市| 诸暨市| 家居| 沽源县| 民县| 兰考县| 临夏县| 伽师县| 留坝县| 大邑县| 天峨县| 休宁县| 莱西市| 镇赉县|