C++ 中 1 的最大數量
假設我們有一個維度為 w x h 的矩陣 M,其中每個單元格的值為 0 或 1,並且 M 的任何大小為 l x l 的正方形子矩陣最多有 maxOnes 個 1。我們需要找到矩陣 M 可以具有的 1 的最大可能數量。
因此,如果輸入類似於 w = 3,h = 3,l = 2,maxOnes = 1,則輸出將為 4,因為在 3*3 矩陣中,沒有 2*2 子矩陣可以具有超過 1 個 1。具有 4 個 1 的最佳解決方案是 -
1 | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
為了解決這個問題,我們將遵循以下步驟 -
ret := 0
建立一個大小為 n x n 的二維陣列 sq
初始化 i := 0,當 i < height 時,更新(i 增加 1),執行 -
初始化 j := 0,當 j < width 時,更新(j 增加 1),執行 -
將 sq[i mod n, j mod n] 增加 1
定義一個數組 v
初始化 i := 0,當 i < n 時,更新(i 增加 1),執行 -
初始化 j := 0,當 j < n 時,更新(j 增加 1),執行 -
將 sq[i, j] 插入到 v 的末尾
將陣列 v 按降序排序
初始化 i := 0,j := 0,當 i < v 的大小且 j < maxOnes 時,更新(i 增加 1),(j 增加 1),執行 -
返回 ret
讓我們看看以下實現以更好地理解 -
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: int maximumNumberOfOnes(int width, int height, int n, int maxOnes) { int ret = 0; vector < vector <int> > sq(n, vector <int>(n)); for(int i = 0; i < height; i++){ for(int j = 0; j < width; j++){ sq[i % n][j % n]++; } } vector <int> v; for(int i = 0; i < n; i++){ for(int j = 0; j < n ; j++){ v.push_back(sq[i][j]); } } sort(v.rbegin(), v.rend()); for(int i = 0, j = 0; i < v.size() && j < maxOnes; i++, j++){ ret += v[i]; } return ret; } }; main(){ Solution ob; cout << (ob.maximumNumberOfOnes(3,3,2,1)); }
輸入
3, 3, 2, 1
輸出
4
廣告