<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 在給定的按行排序的矩陣的所有行中找到一個公共元素 > 原文: [https://www.geeksforgeeks.org/find-common-element-rows-row-wise-sorted-matrix/](https://www.geeksforgeeks.org/find-common-element-rows-row-wise-sorted-matrix/) 給定一個矩陣,其中每一行都按升序排序。 編寫一個在所有行中查找并返回一個公共元素的函數。 如果沒有公共元素,則返回-1。 **示例**: ``` Input: mat[4][5] = { {1, 2, 3, 4, 5}, {2, 4, 5, 8, 10}, {3, 5, 7, 9, 11}, {1, 3, 5, 7, 9}, }; Output: 5 ``` 一個 **O(m * n * n)簡單解決方案**是采用第一行的每個元素并在所有其他行中進行搜索,直到找到一個公共元素。 該解決方案的時間復雜度為 O(m * n * n),其中 m 是給定矩陣中的行數,n 是列數。 如果我們使用[二分搜索](http://geeksquiz.com/binary-search/)而不是線性搜索,則可以將其改進為 O(m * n * Logn)。 我們可以使用類似于[合并排序](http://geeksquiz.com/merge-sort/)的合并方法在 O(mn)時間中解決此問題**。 這個想法是從每一行的最后一列開始。 如果所有最后一列的元素都相同,那么我們找到了公共元素。 否則,我們找到所有最后一列中的最小值。 找到最小元素后,我們知道最后一列中的所有其他元素不能成為公共元素,因此我們會減少所有行的最后一列索引,除了具有最小值的行。 我們一直重復這些步驟,直到當前最后一列的所有元素都不相同,或者最后一列的索引達到 0。** 以下是上述想法的實現。 ## C++ ```cpp // A C++ program to find a common element in all rows of a // row wise sorted array #include <bits/stdc++.h> using namespace std; // Specify number of rows and columns #define M 4 #define N 5 // Returns common element in all rows of mat[M][N]. If there is no // common element, then -1 is returned int findCommon(int mat[M][N]) { ????// An array to store indexes of current last column ????int column[M]; ????int min_row; // To store index of row whose current ????// last element is minimum ????// Initialize current last element of all rows ????int i; ????for (i = 0; i < M; i++) ????????column[i] = N - 1; ????min_row = 0; // Initialize min_row as first row ????// Keep finding min_row in current last column, till either ????// all elements of last column become same or we hit first column. ????while (column[min_row] >= 0) { ????????// Find minimum in current last column ????????for (i = 0; i < M; i++) { ????????????if (mat[i][column[i]] < mat[min_row][column[min_row]]) ????????????????min_row = i; ????????} ????????// eq_count is count of elements equal to minimum in current last ????????// column. ????????int eq_count = 0; ????????// Traverse current last column elements again to update it ????????for (i = 0; i < M; i++) { ????????????// Decrease last column index of a row whose value is more ????????????// than minimum. ????????????if (mat[i][column[i]] > mat[min_row][column[min_row]]) { ????????????????if (column[i] == 0) ????????????????????return -1; ????????????????column[i] -= 1; // Reduce last column index by 1 ????????????} ????????????else ????????????????eq_count++; ????????} ????????// If equal count becomes M, return the value ????????if (eq_count == M) ????????????return mat[min_row][column[min_row]]; ????} ????return -1; } // Driver Code int main() { ????int mat[M][N] = { ????????{ 1, 2, 3, 4, 5 }, ????????{ 2, 4, 5, 8, 10 }, ????????{ 3, 5, 7, 9, 11 }, ????????{ 1, 3, 5, 7, 9 }, ????}; ????int result = findCommon(mat); ????if (result == -1) ????????cout << "No common element"; ????else ????????cout << "Common element is " << result; ????return 0; } // This code is contributed // by Akanksha Rai ``` ## C ``` // A C program to find a common element in all rows of a // row wise sorted array #include <stdio.h> // Specify number of rows and columns #define M 4 #define N 5 // Returns common element in all rows of mat[M][N]. If there is no // common element, then -1 is returned int findCommon(int mat[M][N]) { ????// An array to store indexes of current last column ????int column[M]; ????int min_row; // To store index of row whose current ????// last element is minimum ????// Initialize current last element of all rows ????int i; ????for (i = 0; i < M; i++) ????????column[i] = N - 1; ????min_row = 0; // Initialize min_row as first row ????// Keep finding min_row in current last column, till either ????// all elements of last column become same or we hit first column. ????while (column[min_row] >= 0) { ????????// Find minimum in current last column ????????for (i = 0; i < M; i++) { ????????????if (mat[i][column[i]] < mat[min_row][column[min_row]]) ????????????????min_row = i; ????????} ????????// eq_count is count of elements equal to minimum in current last ????????// column. ????????int eq_count = 0; ????????// Traverse current last column elements again to update it ????????for (i = 0; i < M; i++) { ????????????// Decrease last column index of a row whose value is more ????????????// than minimum. ????????????if (mat[i][column[i]] > mat[min_row][column[min_row]]) { ????????????????if (column[i] == 0) ????????????????????return -1; ????????????????column[i] -= 1; // Reduce last column index by 1 ????????????} ????????????else ????????????????eq_count++; ????????} ????????// If equal count becomes M, return the value ????????if (eq_count == M) ????????????return mat[min_row][column[min_row]]; ????} ????return -1; } // driver program to test above function int main() { ????int mat[M][N] = { ????????{ 1, 2, 3, 4, 5 }, ????????{ 2, 4, 5, 8, 10 }, ????????{ 3, 5, 7, 9, 11 }, ????????{ 1, 3, 5, 7, 9 }, ????}; ????int result = findCommon(mat); ????if (result == -1) ????????printf("No common element"); ????else ????????printf("Common element is %d", result); ????return 0; } ``` ## Java ```java // A Java program to find a common // element in all rows of a // row wise sorted array class GFG { ????// Specify number of rows and columns ????static final int M = 4; ????static final int N = 5; ????// Returns common element in all rows ????// of mat[M][N]. If there is no ????// common element, then -1 is ????// returned ????static int findCommon(int mat[][]) ????{ ????????// An array to store indexes ????????// of current last column ????????int column[] = new int[M]; ????????// To store index of row whose current ????????// last element is minimum ????????int min_row; ????????// Initialize current last element of all rows ????????int i; ????????for (i = 0; i < M; i++) ????????????column[i] = N - 1; ????????// Initialize min_row as first row ????????min_row = 0; ????????// Keep finding min_row in current last column, till either ????????// all elements of last column become same or we hit first column. ????????while (column[min_row] >= 0) { ????????????// Find minimum in current last column ????????????for (i = 0; i < M; i++) { ????????????????if (mat[i][column[i]] < mat[min_row][column[min_row]]) ????????????????????min_row = i; ????????????} ????????????// eq_count is count of elements equal to minimum in current last ????????????// column. ????????????int eq_count = 0; ????????????// Traverse current last column elements again to update it ????????????for (i = 0; i < M; i++) { ????????????????// Decrease last column index of a row whose value is more ????????????????// than minimum. ????????????????if (mat[i][column[i]] > mat[min_row][column[min_row]]) { ????????????????????if (column[i] == 0) ????????????????????????return -1; ????????????????????// Reduce last column index by 1 ????????????????????column[i] -= 1; ????????????????} ????????????????else ????????????????????eq_count++; ????????????} ????????????// If equal count becomes M, ????????????// return the value ????????????if (eq_count == M) ????????????????return mat[min_row][column[min_row]]; ????????} ????????return -1; ????} ????// Driver code ????public static void main(String[] args) ????{ ????????int mat[][] = { { 1, 2, 3, 4, 5 }, ????????????????????????{ 2, 4, 5, 8, 10 }, ????????????????????????{ 3, 5, 7, 9, 11 }, ????????????????????????{ 1, 3, 5, 7, 9 } }; ????????int result = findCommon(mat); ????????if (result == -1) ????????????System.out.print("No common element"); ????????else ????????????System.out.print("Common element is " + result); ????} } // This code is contributed by Anant Agarwal. ``` ## Python 3 ``` # Python 3 program to find a common element? # in all rows of a row wise sorted array # Specify number of rows? # and columns M = 4 N = 5 # Returns common element in all rows? # of mat[M][N]. If there is no common? # element, then -1 is returned def findCommon(mat): ????# An array to store indexes of? ????# current last column ????column = [N - 1] * M ????min_row = 0 # Initialize min_row as first row ????# Keep finding min_row in current last? ????# column, till either all elements of? ????# last column become same or we hit first column. ????while (column[min_row] >= 0): ????????# Find minimum in current last column ????????for i in range(M): ????????????if (mat[i][column[i]] <? ????????????????mat[min_row][column[min_row]]): ????????????????min_row = i ????????# eq_count is count of elements equal? ????????# to minimum in current last column. ????????eq_count = 0 ????????# Traverse current last column elements ????????# again to update it ????????for i in range(M): ????????????# Decrease last column index of a row? ????????????# whose value is more than minimum. ????????????if (mat[i][column[i]] >? ????????????????mat[min_row][column[min_row]]): ????????????????if (column[i] == 0): ????????????????????return -1 ????????????????column[i] -= 1 # Reduce last column ???????????????????????????????# index by 1 ????????????else: ????????????????eq_count += 1 ????????# If equal count becomes M, return the value ????????if (eq_count == M): ????????????return mat[min_row][column[min_row]] ????return -1 # Driver Code if __name__ == "__main__": ????mat = [[1, 2, 3, 4, 5], ???????????[2, 4, 5, 8, 10], ???????????[3, 5, 7, 9, 11], ???????????[1, 3, 5, 7, 9]] ????result = findCommon(mat) ????if (result == -1): ????????print("No common element") ????else: ????????print("Common element is", result) # This code is contributed by ita_c ``` ## C# ```cs // A C# program to find a common // element in all rows of a // row wise sorted array using System; class GFG { ????// Specify number of rows and columns ????static int M = 4; ????static int N = 5; ????// Returns common element in all rows ????// of mat[M][N]. If there is no ????// common element, then -1 is ????// returned ????static int findCommon(int[, ] mat) ????{ ????????// An array to store indexes ????????// of current last column ????????int[] column = new int[M]; ????????// To store index of row whose ????????// current last element is minimum ????????int min_row; ????????// Initialize current last element ????????// of all rows ????????int i; ????????for (i = 0; i < M; i++) ????????????column[i] = N - 1; ????????// Initialize min_row as first row ????????min_row = 0; ????????// Keep finding min_row in current ????????// last column, till either all ????????// elements of last column become ????????// same or we hit first column. ????????while (column[min_row] >= 0) { ????????????// Find minimum in current ????????????// last column ????????????for (i = 0; i < M; i++) { ????????????????if (mat[i, column[i]] < mat[min_row, column[min_row]]) ????????????????????min_row = i; ????????????} ????????????// eq_count is count of elements ????????????// equal to minimum in current ????????????// last column. ????????????int eq_count = 0; ????????????// Traverse current last column ????????????// elements again to update it ????????????for (i = 0; i < M; i++) { ????????????????// Decrease last column index ????????????????// of a row whose value is more ????????????????// than minimum. ????????????????if (mat[i, column[i]] > mat[min_row, column[min_row]]) { ????????????????????if (column[i] == 0) ????????????????????????return -1; ????????????????????// Reduce last column index ????????????????????// by 1 ????????????????????column[i] -= 1; ????????????????} ????????????????else ????????????????????eq_count++; ????????????} ????????????// If equal count becomes M, ????????????// return the value ????????????if (eq_count == M) ????????????????return mat[min_row, ???????????????????????????column[min_row]]; ????????} ????????return -1; ????} ????// Driver code ????public static void Main() ????{ ????????int[, ] mat = { { 1, 2, 3, 4, 5 }, ????????????????????????{ 2, 4, 5, 8, 10 }, ????????????????????????{ 3, 5, 7, 9, 11 }, ????????????????????????{ 1, 3, 5, 7, 9 } }; ????????int result = findCommon(mat); ????????if (result == -1) ????????????Console.Write("No common element"); ????????else ????????????Console.Write("Common element is " ??????????????????????????+ result); ????} } // This code is contributed by Sam007\. ``` **輸出**: ``` Common element is 5 ``` **以上代碼** 的工作解釋讓我們理解以下示例的上述代碼的工作。 最后一列數組中的初始條目為 N-1,即{4,4,4,4} {1,2,3,4, **5** }, {2,4 、、 5、8, **10** }, {3、5、7、9, **11** }, {1、3、5、7, **9** }, min_row 的值為 0,因此值大于 5 的行的最后一列索引的值將減少 1。 因此 column []變為{4,3,3,3}。 {1,2,3,4, **5** }, {2,4,5, **8** ,10}, {3,5, 7, **9** ,11}, {1,3,5, **7** ,9}, min_row 的值保持為 0,值大于 5 的行的最后一列索引的值減小 1。 因此 column []變為{4,2,2,2}。 {1,2,3,4, **5** }, {2,4, **5** ,8,10}, {3,5, **7** ,9、11}, {1、3, **5** ,7、9}, min_row 的值保持為 0,值大于 5 的行的最后一列索引的值減小 1。 因此 colomun []變為{4,2,1,2}。 {1,2,3,4, **5** }, {2,4, **5** ,8,10}, {3, **5** ,7、9、11}, {1、3, **5** ,7、9}, 現在,所有行的當前最后一列中的所有值都相同,因此返回 5。 **基于哈希的解決方案** 我們也可以使用哈希。 即使未對行進行排序,此解決方案也有效。 它可用于打印所有常見元素。 ``` Step1: Create a Hash Table with all key as distinct elements of row1\. Value for all these will be 0. Step2: For i = 1 to M-1 For j = 0 to N-1 If (mat[i][j] is already present in Hash Table) If (And this is not a repetition in current row. This can be checked by comparing HashTable value with row number) Update the value of this key in HashTable with current row number Step3: Iterate over HashTable and print all those keys for which value = M ``` ## C++ ``` // C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Specify number of rows and columns #define M 4 #define N 5 // Returns common element in all rows of mat[M][N]. If there is no // common element, then -1 is returned int findCommon(int mat[M][N]) { ????// A hash map to store count of elements ????unordered_map<int, int> cnt; ????int i, j; ????for (i = 0; i < M; i++) { ????????// Increment the count of first ????????// element of the row ????????cnt[mat[i][0]]++; ????????// Starting from the second element ????????// of the current row ????????for (j = 1; j < N; j++) { ????????????// If current element is different from ????????????// the previous element i.e. it is appearing ????????????// for the first time in the current row ????????????if (mat[i][j] != mat[i][j - 1]) ????????????????cnt[mat[i][j]]++; ????????} ????} ????// Find element having count equal to number of rows ????for (auto ele : cnt) { ????????if (ele.second == M) ????????????return ele.first; ????} ????// No such element found ????return -1; } // Driver Code int main() { ????int mat[M][N] = { ????????{ 1, 2, 3, 4, 5 }, ????????{ 2, 4, 5, 8, 10 }, ????????{ 3, 5, 7, 9, 11 }, ????????{ 1, 3, 5, 7, 9 }, ????}; ????int result = findCommon(mat); ????if (result == -1) ????????cout << "No common element"; ????else ????????cout << "Common element is " << result; ????return 0; } ``` ## Java ```java // Java implementation of the approach import java.util.*; class GFG? { // Specify number of rows and columns static int M = 4; static int N = 5; // Returns common element in all rows of mat[M][N]. // If there is no common element, then -1 is returned static int findCommon(int mat[][]) { ????// A hash map to store count of elements ????HashMap<Integer,? ????????????Integer> cnt = new HashMap<Integer,? ???????????????????????????????????????Integer>(); ????int i, j; ????for (i = 0; i < M; i++)? ????{ ????????// Increment the count of first ????????// element of the row ????????if(cnt.containsKey(mat[i][0])) ????????{ ????????????cnt.put(mat[i][0],? ????????????cnt.get(mat[i][0]) + 1); ????????} ????????else ????????{ ????????????cnt.put(mat[i][0], 1); ????????} ????????// Starting from the second element ????????// of the current row ????????for (j = 1; j < N; j++)? ????????{ ????????????// If current element is different from ????????????// the previous element i.e. it is appearing ????????????// for the first time in the current row ????????????if (mat[i][j] != mat[i][j - 1]) ????????????????if(cnt.containsKey(mat[i][j])) ????????????????{ ????????????????????cnt.put(mat[i][j],? ????????????????????cnt.get(mat[i][j]) + 1); ????????????????} ????????????????else ????????????????{ ????????????????????cnt.put(mat[i][j], 1); ????????????????} ????????} ????} ????// Find element having count? ????// equal to number of rows ????for (Map.Entry<Integer,? ???????????????????Integer> ele : cnt.entrySet()) ????{ ????????if (ele.getValue() == M) ????????????return ele.getKey(); ????} ????// No such element found ????return -1; } // Driver Code public static void main(String[] args)? { ????int mat[][] = {{ 1, 2, 3, 4, 5 }, ???????????????????{ 2, 4, 5, 8, 10 }, ???????????????????{ 3, 5, 7, 9, 11 }, ???????????????????{ 1, 3, 5, 7, 9 }}; ????int result = findCommon(mat); ????if (result == -1) ????????System.out.println("No common element"); ????else ????????System.out.println("Common element is " + result); ????} } // This code is contributed by Rajput-Ji ``` ## Python ``` # Python3 implementation of the approach from collections import defaultdict # Specify number of rows and columns M = 4 N = 5 # Returns common element in all rows of # mat[M][N]. If there is no # common element, then -1 is returned def findCommon(mat): ????global M ????global N ????# A hash map to store count of elements ????cnt = dict() ????cnt = defaultdict(lambda: 0, cnt) ????i = 0 ????j = 0 ????while (i < M ):? ????????# Increment the count of first ????????# element of the row ????????cnt[mat[i][0]] = cnt[mat[i][0]] + 1 ????????j = 1 ????????# Starting from the second element ????????# of the current row ????????while (j < N ) : ????????????# If current element is different from ????????????# the previous element i.e. it is appearing ????????????# for the first time in the current row ????????????if (mat[i][j] != mat[i][j - 1]): ????????????????cnt[mat[i][j]] = cnt[mat[i][j]] + 1 ????????????j = j + 1 ????????i = i + 1 ????# Find element having count equal to number of rows ????for ele in cnt: ????????if (cnt[ele] == M): ????????????return ele ????# No such element found ????return -1 # Driver Code mat = [[1, 2, 3, 4, 5 ], ????????[2, 4, 5, 8, 10], ????????[3, 5, 7, 9, 11], ????????[1, 3, 5, 7, 9 ],] result = findCommon(mat) if (result == -1): ????print("No common element") else: ????print("Common element is ", result) # This code is contributed by Arnab Kundu ``` ## C# ``` // C# implementation of the approach using System; using System.Collections.Generic;? class GFG? { // Specify number of rows and columns static int M = 4; static int N = 5; // Returns common element in all rows of mat[M,N]. // If there is no common element, then -1 is returned static int findCommon(int [,]mat) { ????// A hash map to store count of elements ????Dictionary<int, ???????????????int> cnt = new Dictionary<int,? ?????????????????????????????????????????int>(); ????int i, j; ????for (i = 0; i < M; i++)? ????{ ????????// Increment the count of first ????????// element of the row ????????if(cnt.ContainsKey(mat[i, 0])) ????????{ ????????????cnt[mat[i, 0]]= cnt[mat[i, 0]] + 1; ????????} ????????else ????????{ ????????????cnt.Add(mat[i, 0], 1); ????????} ????????// Starting from the second element ????????// of the current row ????????for (j = 1; j < N; j++)? ????????{ ????????????// If current element is different from ????????????// the previous element i.e. it is appearing ????????????// for the first time in the current row ????????????if (mat[i, j] != mat[i, j - 1]) ????????????????if(cnt.ContainsKey(mat[i, j])) ????????????????{ ????????????????????cnt[mat[i, j]]= cnt[mat[i, j]] + 1; ????????????????} ????????????????else ????????????????{ ????????????????????cnt.Add(mat[i, j], 1); ????????????????} ????????} ????} ????// Find element having count? ????// equal to number of rows ????foreach(KeyValuePair<int, int> ele in cnt) ????{ ????????if (ele.Value == M) ????????????return ele.Key; ????} ????// No such element found ????return -1; } // Driver Code public static void Main(String[] args)? { ????int [,]mat = {{ 1, 2, 3, 4, 5 }, ??????????????????{ 2, 4, 5, 8, 10 }, ??????????????????{ 3, 5, 7, 9, 11 }, ??????????????????{ 1, 3, 5, 7, 9 }}; ????int result = findCommon(mat); ????if (result == -1) ????????Console.WriteLine("No common element"); ????else ????????Console.WriteLine("Common element is " + result); ????} }? // This code is contributed by 29AjayKumar ``` **輸出**: ``` Common element is 5 ``` 在哈希表中進行搜索和插入需要`O(1)`時間的假設下,上述基于哈希的解決方案的時間復雜度為 O(MN)。 感謝 Nishant 在下面的評論中建議此解決方案。 **練習**:給定 n 個大小為 m 的已排序數組,請在 O(mn)時間內找到所有數組中的所有公共元素。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看