leetcode周赛 (2020/07/12)

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];
    }
};

4. 服务中心的最佳位置

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值