1. 好数对的数目
思路
直接暴力
代码
class Solution {
public:
int numIdenticalPairs(vector<int>& nums) {
int N = nums.size();
if(N<1)
return 0;
int ans = 0;
for(int i=0;i<N;i++)
{
for(int j=i+1;j<N;j++)
{
if(nums[i]==nums[j])
ans++;
}
}
return ans;
}
};
2. 仅含1的子串数
思路
经典前缀和
代码
const int MOD = 1e9+7;
class Solution {
public:
int numSub(string s) {
int N = s.length();
vector<int> cnt(N,0);
int ans = 0;
for(int i=0;i<N;i++)
{
if(s[i]=='1')
{
cnt[i] = 1;
if(i>0)
{
cnt[i] += cnt[i-1];
}
}
else cnt[i] = 0;
ans = (ans+cnt[i])%MOD;
}
return ans;
}
};
3. 概率最大的路径
这题搞了好久,好久没写dijkstra了,手生了。
思路一
思路一是使用dijkstra算法,但是没有优化的版本会超时,需要用优先队列优化的dijkstra算法。
代码1
typedef pair<double, int> P;
class Solution {
public:
vector<double> dis;
vector<bool> used;
map<pair<int,int>,double> probs;
map<int,vector<int>> nedges;
set<int> nodest;
int ends;
void dijkstra(int s,int N)
{
priority_queue<P> que;
dis = vector<double>(N,0.0);
dis[s] = 1.0;
que.push(P(1.0,s));
while(que.size())
{
P p = que.top();
que.pop();
int v = p.second;
if(dis[v] > p.first)
continue;
for(int i=0;i<nedges[v].size();i++)
{
int u = nedges[v][i];
if(dis[v]*probs[make_pair(u,v)]>dis[u])
{
dis[u] = dis[v]*probs[make_pair(u,v)];
que.push(P(dis[u],u));
}
}
}
}
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
map<pair<int,int>,double> prob;
int ind = 0;
ends = end;
set<int> nodes;
for(auto edge : edges){
prob[make_pair(edge[0],edge[1])] = succProb[ind];
prob[make_pair(edge[1],edge[0])] = succProb[ind];
ind++;
nedges[edge[0]].push_back(edge[1]);
nedges[edge[1]].push_back(edge[0]);
nodes.insert(edge[0]);
nodes.insert(edge[1]);
}
nodest = nodes;
probs = prob;
dijkstra(start,n);
return dis[end];
}
};
思路2
用bfs
代码2
typedef pair<double, int> P;
class Solution {
public:
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
vector<vector<int>> nedges(n);
vector<double> dis(n,0.0);
vector<bool> used(n,false);
map<pair<int,int>, double> graph;
int ind = 0;
for(auto edge : edges)
{
nedges[edge[0]].push_back(edge[1]);
nedges[edge[1]].push_back(edge[0]);
graph[make_pair(edge[0],edge[1])] = succProb[ind];
graph[make_pair(edge[1],edge[0])] = succProb[ind];
ind++;
}
queue<P> que;
que.push(P(1.0,start));
dis[start] = 1.0;
while(!que.empty())
{
P p = que.front();
que.pop();
double d = p.first;
int u = p.second;
for(int i=0;i<nedges[u].size();i++)
{
int v = nedges[u][i];
if(dis[v]<d*graph[make_pair(u,v)])
{
dis[v] = d * graph[make_pair(u,v)];
que.push(P(dis[v],v));
}
}
}
return dis[end];
}
};