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
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP