国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

( 數(shù)組和矩陣) 378. 有序矩陣中第 K 小的元素 ——【Leetcode每日一題】

這篇具有很好參考價值的文章主要介紹了( 數(shù)組和矩陣) 378. 有序矩陣中第 K 小的元素 ——【Leetcode每日一題】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?378. 有序矩陣中第 K 小的元素

難度:中等

給你一個 n x n n x n nxn 矩陣 m a t r i x matrix matrix ,其中每行和每列元素均按升序排序,找到矩陣中第 k 小的元素。
請注意,它是 排序后 的第 k 小元素,而不是第 k 個 不同 的元素。

你必須找到一個內(nèi)存復(fù)雜度優(yōu)于 O ( n 2 ) O(n^2) O(n2) 的解決方案。

示例 1:

輸入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
輸出:13
解釋:矩陣中的元素為 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13

示例 2:

輸入:matrix = [[-5]], k = 1
輸出:-5

提示:

  • n == matrix.length
  • n == matrix[i].length
  • 1 <= n <= 300
  • ? 1 0 9 < = m a t r i x [ i ] [ j ] < = 1 0 9 -10^9 <= matrix[i][j] <= 10^9 ?109<=matrix[i][j]<=109
  • 題目數(shù)據(jù) 保證 matrix 中的所有行和列都按 非遞減順序 排列
  • 1 < = k < = n 2 1 <= k <= n^2 1<=k<=n2

進(jìn)階:

  • 你能否用一個恒定的內(nèi)存(即 O ( 1 ) O(1) O(1) 內(nèi)存復(fù)雜度)來解決這個問題?
  • 你能在 O ( n ) O(n) O(n) 的時間復(fù)雜度下解決這個問題嗎?這個方法對于面試來說可能太超前了,但是你會發(fā)現(xiàn)閱讀這篇文章( this paper )很有趣。

??思路:

法一:二分查找

找出二維矩陣中最小的數(shù) l,最大的數(shù) h,我們?nèi)?strong>中位數(shù) mid = (l + h) / 2,在二維矩陣中尋找小于等于 mid 的元素個數(shù)cnt

  • 若這個cnt 小于k,表明第k小的數(shù)在右半部分不包含mid,即 l = mid + 1,h不變;
  • 若這個cnt 大于等于k,表明第k小的數(shù)在左半部分可能包含 mid,即 l 不變, h = mid - 1;
  • 當(dāng)l > h 時,第 k 小的數(shù)即被找出,等于l。

法二:歸并排序

由題目給出的性質(zhì)可知,這個矩陣的每一行均為一個有序數(shù)組。問題即轉(zhuǎn)化為從這 n 個有序數(shù)組中找第 k 大的數(shù),可以想到利用歸并排序的做法,歸并到第 k 個數(shù)即可停止。

一般歸并排序是兩個數(shù)組歸并,而本題是 n 個數(shù)組歸并,所以需要用小根堆維護(hù),以優(yōu)化時間復(fù)雜度。

??代碼:(Java、C++)

法一:二分查找
Java

class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        int n = matrix.length;
        int l = matrix[0][0], h = matrix[n - 1][n - 1];
        while(l <= h){
            int mid = l + (h - l) / 2;
            int cnt = 0;
            for(int i = 0; i < n; i++){
                for(int j = 0; j < n && matrix[i][j] <= mid; j++){
                    cnt++;
                }
            }
            if(cnt < k) l = mid + 1;
            else h = mid - 1;
        }
        return l;
    }
}

C++

class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        int n = matrix.size();
        int l = matrix[0][0], h = matrix[n - 1][n - 1];
        while(l <= h){
            int mid = l + (h - l) / 2;
            int cnt = 0;
            for(int i = 0; i < n; i++){
                for(int j = 0; j < n && matrix[i][j] <= mid; j++){
                    cnt++;
                }
            }
            if(cnt < k) l = mid + 1;
            else h = mid - 1;
        }
        return l;
    }
};

法二:歸并排序
Java

class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
            public int compare(int[] a, int[] b){
                return a[0] - b[0];
            }
        });
        int n = matrix.length;
        for(int i = 0; i < n; i++){//第一列分別為n數(shù)組的頭結(jié)點
            pq.offer(new int[] {matrix[i][0], i, 0});
        }
        for(int i = 0; i < k - 1; i++){
            int[] now = pq.poll();//彈出最小的那個
            if(now[2] != n - 1){//不是一行的最后一個元素
                pq.offer(new int[]{matrix[now[1]][now[2] + 1], now[1], now[2] + 1});
            }
        }
        return pq.poll()[0];
    }
}

C++

class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        struct point{
            int val, x, y;
            point(int val, int x, int y): val(val), x(x), y(y){};
            bool operator> (const point& a)const{
                return this->val > a.val;
            }
        };
        priority_queue<point, vector<point>, greater<point>> que;
        int n = matrix.size();
        for(int i = 0; i < n; i++){
            que.emplace(matrix[i][0], i, 0);
        }
        for(int i = 0; i < k - 1; i++){
            point now = que.top();
            que.pop();
            if(now.y != n - 1){
                que.emplace(matrix[now.x][now.y + 1], now.x, now.y + 1);
            }
        }
        return que.top().val;
    }
};
?? 運行結(jié)果:

( 數(shù)組和矩陣) 378. 有序矩陣中第 K 小的元素 ——【Leetcode每日一題】,LeetCode,leetcode,矩陣,算法

?? 復(fù)雜度分析:
  • 時間復(fù)雜度 O ( n l o g ( r ? l ) ) O(nlog(r - l)) O(nlog(r?l)),二分查找進(jìn)行次數(shù)為 O ( n l o g ( r ? l ) ) O(nlog(r - l)) O(nlog(r?l)), 每次操作時間復(fù)雜度為 O ( n ) O(n) O(n)。歸并排序時間復(fù)雜度為 O ( k l o g n ) O(klogn) O(klogn),歸并 k 次,每次堆中插入和彈出的操作時間復(fù)雜度均為 l o g n logn logn。
  • 空間復(fù)雜度 O ( 1 ) O(1) O(1);歸并排序空間復(fù)雜度為 O ( n ) O(n) O(n),堆的大小始終為 n。

題目來源:力扣。

放棄一件事很容易,每天能堅持一件事一定很酷,一起每日一題吧!
關(guān)注我 leetCode專欄,每日更新!文章來源地址http://www.zghlxwxcb.cn/news/detail-626853.html

注: 如有不足,歡迎指正!

到了這里,關(guān)于( 數(shù)組和矩陣) 378. 有序矩陣中第 K 小的元素 ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 每日一題 230二叉搜索樹中第K小的元素(中序遍歷)

    每日一題 230二叉搜索樹中第K小的元素(中序遍歷)

    給定一個二叉搜索樹的根節(jié)點? root ?,和一個整數(shù)? k ?,請你設(shè)計一個算法查找其中第? k ? 個最小元素(從 1 開始計數(shù))。 示例 1: 示例 2:

    2024年02月10日
    瀏覽(20)
  • 【LeetCode-中等題】230. 二叉搜索樹中第K小的元素

    【LeetCode-中等題】230. 二叉搜索樹中第K小的元素

    該題最大的特點就是這個樹是二叉樹: 所以, 中序遍歷對二叉樹的遍歷本身就是有序的 思想很簡單,就是通過層序遍歷將節(jié)點都加到List集合中,然后調(diào)用 Collections.sort(list)排序后 ,找第k小的數(shù) list.get(k-1) 二叉樹中序遍歷得到的值序列是遞增有序的 借助一個list集合來接收有

    2024年02月10日
    瀏覽(50)
  • 每日一題——LeetCode1287.有序數(shù)組中出現(xiàn)次數(shù)超過25%的元素

    每日一題——LeetCode1287.有序數(shù)組中出現(xiàn)次數(shù)超過25%的元素

    方法一 一次循環(huán)統(tǒng)計 題目給出的數(shù)據(jù)相同的元素都是相鄰的,那么直接從頭開始遍歷,統(tǒng)計每種元素出現(xiàn)次數(shù),當(dāng)有元素次數(shù)超過arr.length/4即為要求的元素 ? 消耗時間和內(nèi)存情況: 方法二 方法一簡化版 設(shè)步長step=arr.length/4,如果某個元素arr[i],跨越一個步長后arr[i+step],即

    2024年01月22日
    瀏覽(27)
  • 【LeetCode】每日一題&&兩數(shù)之和&&尋找正序數(shù)組的中位數(shù)&&找出字符串中第一個匹配項的下標(biāo)&&在排序數(shù)組中查找元素的第一個和最后一個位置

    【LeetCode】每日一題&&兩數(shù)之和&&尋找正序數(shù)組的中位數(shù)&&找出字符串中第一個匹配項的下標(biāo)&&在排序數(shù)組中查找元素的第一個和最后一個位置

    ========================================================================= 主頁點擊直達(dá): 個人主頁 我的小倉庫: 代碼倉庫 C語言偷著笑: C語言專欄 數(shù)據(jù)結(jié)構(gòu)挨打小記: 初階數(shù)據(jù)結(jié)構(gòu)專欄 Linux被操作記: Linux專欄 LeetCode刷題掉發(fā)記: LeetCode刷題 算法: 算法專欄? C++頭疼記: C++專欄 計算機

    2024年02月08日
    瀏覽(36)
  • leetcode 215.數(shù)組中第k大的元素

    leetcode 215.數(shù)組中第k大的元素

    ?? leetcode鏈接:數(shù)組中第k大的元素 思路: 使用堆數(shù)據(jù)結(jié)構(gòu),大堆的堆頂是堆內(nèi)最大的元素,也就是把當(dāng)前堆 pop k - 1 次,第 k 次 top 出來的元素就是第 k 大的數(shù)。 代碼:

    2024年02月09日
    瀏覽(31)
  • 力扣HOT100 - 230. 二叉搜索樹中第K小的元素

    力扣HOT100 - 230. 二叉搜索樹中第K小的元素

    解題思路:

    2024年04月25日
    瀏覽(30)
  • 【LeetCode熱題100】打卡第39天:數(shù)組中第K個最大元素&最大正方形

    【LeetCode熱題100】打卡第39天:數(shù)組中第K個最大元素&最大正方形

    大家好,我是知識汲取者,歡迎來到我的LeetCode熱題100刷題專欄! 精選 100 道力扣(LeetCode)上最熱門的題目,適合初識算法與數(shù)據(jù)結(jié)構(gòu)的新手和想要在短時間內(nèi)高效提升的人,熟練掌握這 100 道題,你就已經(jīng)具備了在代碼世界通行的基本能力。在此專欄中,我們將會涵蓋各種

    2024年02月16日
    瀏覽(20)
  • C語言每日一題:6.移除元素+合并兩個有序數(shù)組。

    C語言每日一題:6.移除元素+合并兩個有序數(shù)組。

    一:暴力查找的方法: 1.找到對應(yīng)val值的下標(biāo),返回數(shù)組的下標(biāo)。 2.刪除對應(yīng)的下標(biāo),從前向后用后面覆蓋前面。當(dāng)后一個是數(shù)組最后一個數(shù)值是就賦值結(jié)束了(注意數(shù)組越界的問題)。 3.刪除了一個數(shù)之后數(shù)組元素個數(shù)要–。 4.查找和刪除是在一個循環(huán)里面因為val的值可能

    2024年02月15日
    瀏覽(27)
  • Leetcode每日一題——“合并兩個有序數(shù)組”

    Leetcode每日一題——“合并兩個有序數(shù)組”

    各位CSDN的uu們你們好呀,又到小雅蘭的愉快題解時候啦,今天,我們的題目內(nèi)容是合并兩個有序數(shù)組,下面,讓我們進(jìn)入合并兩個有序數(shù)組的世界吧 示例 1: 輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合并 [1,2,3] 和 [2,5,6] 。 合并結(jié)果是 [ 1,2

    2023年04月24日
    瀏覽(37)
  • 【LeetCode】移除元素、刪除有序數(shù)組中的重復(fù)項、合并兩個有序數(shù)組

    【LeetCode】移除元素、刪除有序數(shù)組中的重復(fù)項、合并兩個有序數(shù)組

    ?????作者: @情話0.0 ??專欄:《LeetCode》 ??題目鏈接:移除元素、刪除有序數(shù)組中的重復(fù)項、合并兩個有序數(shù)組 給你一個數(shù)組 nums 和一個值 val,你需要 原地移除所有數(shù)值等于 val 的元素,并返回移除后數(shù)組的新長度。 不要使用額外的數(shù)組空間,你必須僅使用 O(1) 額外空

    2023年04月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包