Bir Matris Leetcode həllində ən zəif satırlar

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon
alqoritmlər Geyim İkili axtarış kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 38

Problem bəyanat

Problemdə ”Bir Matrisdəki K Zəif Sətirlər” bizə verilir matris n sətir və m sütununun. matris 0 və ya 1 ilə doldurulur. Bu matrisin xüsusiyyəti odur ki, hamısı hər sətrin sol tərəfinə, bütün sıfırlar isə sağ tərəfə tərəfdir.

Hər sətrin gücünü ölçmək üçün bir sıra qaydalar mövcuddur.

  1. Daha çox sayda sıra daha çox gücə malikdir.
  2. Qalereya meydana gəlsə, daha kiçik bir sıra nömrəsi olan sıra daha az gücə malikdir.

Problem bir matrisdəki ən zəif satırları tapmağı xahiş edir.

misal

grid = 
[[1,1,0,0,0],
 [1,1,1,1,0],
 [1,0,0,0,0],
 [1,1,0,0,0],
 [1,1,1,1,1]], 
k = 3
[2,0,3]

Explanation:

  • Zeroth sıra -> 2
  • Birinci sıra -> 4
  • İkinci sıra -> 1
  • Üçüncü sıra-> 2
  • Dördüncü sıra -> 5

Sıfır və dördüncü sıra arasında dördüncüsü daha güclüdür. Beləliklə, cərgələr ən zəifdən güclüə doğru sıralanırdı: 2,0,3,1,4.

Bir Matrix Leetcode həllində K Zəif Sətirlərin yanaşması

Yanaşmanı daha yaxşı başa düşmək üçün daha yaxşı başa düşmək üçün eyni nümunədən istifadə edək. Hər sətirdə olanların sayını sayın. Ancaq bunu bütün cərgəni keçərək edəcəyik zaman xətti vaxt aparacaq. Zaman mürəkkəbliyini yaxşılaşdırmaq üçün hər sətirdə ilk sıfırın indeksini tapmaq üçün ikili axtarışdan istifadə edəcəyik və bu indeks hər sətirdə olanların sayı olacaqdır.

İki şərtə görə çeşidləmə etmək istəyirik:

  1. Hər sətirdə olanların sayı.
  2. Birinin sayı bərabərdirsə, sıra nömrəsi.

Bu hiylədən istifadə edərək onu bir dəyişənə çevirə bilərik. təsvirdən sort vəziyyətinə uyğun bir hesab yarada bilərik.

Bir matrisdəki ən zəif sətirlərə kod kodu həlliPin

 

hesab = əsgərlərin sayı * satırlar + currentRowIndex

Beləliklə, əsgər sayını hesab / sətirlə əldə edə bilərik və% sətirdə rowIndex əldə edə bilərik.

İndi hesabı çeşidləyəcəyik və başlanğıc k hesabının indeksi cavab olacaq.

Həyata keçirilməsi

Matrisdəki K Zəif Sətirlər üçün C ++ kodu

#include <bits/stdc++.h>
using namespace std; 
 int numOnes( vector<int> row) {
        int lo = 0;
        int hi = row.size();
        
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            
            if (row[mid] == 1)
                lo = mid + 1;
            else
                hi = mid;
        }
        
        return lo;
    }
vector<int> kWeakestRows(vector<vector<int>>& mat, int k)  {
    int rows = mat.size();
    int cols = mat[0].size();

    int score[rows];
    int j;
    for (int i = 0; i < rows; i++) {
         j = numOnes(mat[i]);
        score[i] = j * rows + i;
    }

    sort(score,score+rows);
    vector<int>ans(k);
    for (int i = 0; i < k; i++) {
        ans[i] = score[i] % rows;
    }

    return ans;
}
int main() 
{ 
 vector<vector<int> > arr = { {1,1,0,0,0 }, 
                              { 1,1,1,1,0 }, 
                              { 1,0,0,0,0 },
                              { 1,1,0,0,0 },
                              { 1,1,1,1,1 }}; 
 int k=3;                               
 vector<int>ans=kWeakestRows(arr,k); 
 for(int i=0;i<k;i++)
 cout<<ans[i]<<" ";
 cout<<endl;
 return 0;
}
2 0 3

Matrisdəki K Zəif Sətirlər üçün Java kodu

import java.util.*;
public class Tutorialcup {
       public static int numOnes(int[] row) {
        int lo = 0;
        int hi = row.length;
        
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            
            if (row[mid] == 1)
                lo = mid + 1;
            else
                hi = mid;
        }
        
        return lo;
    }
       public static int[] kWeakestRows(int[][] mat, int k) {
    int rows = mat.length;
    int cols = mat[0].length;

    int[] score = new int[rows];
    int j;
    for (int i = 0; i < rows; i++) {
         j = numOnes(mat[i]);
        score[i] = j * rows + i;
    }

    Arrays.sort(score);
    for (int i = 0; i < k; i++) {
        score[i] = score[i] % rows;
    }

    return Arrays.copyOfRange(score, 0, k);
}
   public static void main(String[] args) {
    int [][] arr ={      {1,1,0,0,0 }, 
                              { 1,1,1,1,0 }, 
                              { 1,0,0,0,0 },
                              { 1,1,0,0,0 },
                              { 1,1,1,1,1 }}; 
        int k=3;                               
        int[]ans=kWeakestRows(arr,k); 
        System.out.println(Arrays.toString(ans));
  }
}
2 0 3

Bir Matris Leetcode həllində K Zəif Sətirlərin Mürəkkəblik Analizi

Zaman mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O (n * logm + nlogn). n * logm hər sətirdə olanların sayını hesablamaq üçündür, n * logn isə sıralamaq üçündür. Burada n sətirlərin sayı, m isə sütunların sayıdır.

Kosmik mürəkkəblik

Yuxarıdakı kodun kosmik mürəkkəbliyi O (n) çünki hesabı saxlayırıq. Burada n matrisdəki sıra sayıdır.

References

Şərh yaz

Translate »