最小時間のすべてのポイントへのアクセス
(X2、Y2)をポイント(X1、Y1)からのステップ数が必要とされていることを確認するための簡単なmin(dx,dy)
特徴、dx = abs(x1-x2)
、dy = abs(y1-y2)
class Solution {
public:
int minTimeToVisitAllPoints(vector<vector<int>>& points) {
int ans(0);
int x = points[0][0],y = points[0][1];
for(int i = 1,sz = points.size();i < sz;++i){
ans += dis(x,y,points[i][0],points[i][1]);
x = points[i][0],y = points[i][1];
}
return ans;
}
int dis(int x,int y,int x2,int y2){
return max(abs(x-x2),abs(y-y2));
}
};
統計的には、サーバ通信に参加します
質問の意味:あなたは01行列、1が配置されている需要ライン、列を与えると、1以上します
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
bool vis[n][m];
memset(vis,0,sizeof(vis));
for(int i = 0;i < n;++i){
queue<int>que;
for(int j = 0;j < m;++j) if(grid[i][j]) que.push(j);
if(que.size() > 1){
while(!que.empty()){
int u = que.front();que.pop();
vis[i][u] = true;
}
}
}
for(int i = 0;i <m; ++i){
queue<int>que;
for(int j = 0;j < n;++j) if(grid[j][i]) que.push(j);
if(que.size() > 1){
while(!que.empty()){
int u = que.front();que.pop();
vis[u][i] = true;
}
}
}
int ans(0);
for(int i = 0;i < n;++i) for(int j = 0;j < m;++j) if(vis[i][j]) ans++;
return ans;
}
};
上記のアプローチは、計数しるし対応する点、最終集計後の各列(カラム)のためのものです。あなたはそれを最適化するの数をカウントするCOL []、]行を[使用することができます。
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
int n = grid.size(),m = grid[0].size();
int row[n] = {0},col[m] = {0};
for(int i = 0;i < n;++i) for(int j = 0;j < m;++j)
if(grid[i][j]) row[i]++,col[j]++;
int ans(0);
for(int i = 0;i < n;++i) for(int j = 0;j < m;++j)
if(grid[i][j] && (row[i] > 1 || col[j] > 1)) ans ++;
return ans;
}
};
検索推薦システム
問題の意味:その各プレフィックス文字列をテンプレートプレフィックスを求めて、クエリ文字列searchWordを考えると(数以上の3つの出力辞書順最小の3です)
class Solution {
public:
vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
map<string,priority_queue<string,vector<string>,less<string> > >p;
for(auto i :products){
for(int j = 1;j <= i.length();++j){
string subs = i.substr(0,j);
if(p.find(subs) == p.end()){
priority_queue<string,vector<string>,less<string>> que;
p.insert(make_pair(subs,que));
}
p[subs].push(i);
if(p[subs].size() > 3) p[subs].pop();
}
}
vector<vector<string>> ans(searchWord.length());
for(int j = 1, sz = searchWord.length();j <= sz;++j){
string subs = j == sz ? searchWord :searchWord.substr(0,j);
map<string,priority_queue<string> > ::iterator ret = p.find(subs);
if(ret != p.end()){
priority_queue<string,vector<string>,less<string> >que = (ret->second);
while(que.size() > 0){
ans[j-1].push_back(que.top());que.pop();
}
reverse(ans[j-1].begin(),ans[j-1].end());
}
}
//*/
return ans;
}
};
場所にプログラムの数を停止します
問題の意味:長arrLen配列、0から始まり、左都度、右、固定(境界の外側に移動しません)。さらに別の実施形態0、1E9 + 7のモジュロステップの必要数後。
\ [DP [I] [J] = DP [I-1]〜[J] + DP [I-1] [J-1] + DP [I-1] [J + 1] \]
ここで、私は、現在のステップ数を表し、jは現在位置を示します
class Solution {
public:
static const int maxn = 5e2+7;
static const long long MOD = 1e9+7;
int dp[maxn][maxn];
int numWays(int steps, int arrLen) {
arrLen = min(steps,arrLen);
dp[0][0] = 1;
for(int i = 1;i <= steps;++i){
for(int j = 0;j < arrLen;++j){
dp[i][j] = dp[i-1][j];
if(j > 0) dp[i][j] = (dp[i][j] + dp[i-1][j-1])%MOD;
if(j < arrLen-1) dp[i][j] = (dp[i][j] + dp[i-1][j+1])%MOD;
}
}
return dp[steps][0];
}
};