zoukankan      html  css  js  c++  java
  • LeetCode 图

    DAG有向无环图 拓扑排序(207,208)

    拓扑排序判断有无环。判断是否是有向无环图

    方法1:DFS

    思路:(自己多在演草纸上想想,把所有演草纸收集起来!)

    题解:https://chenzhuo.blog.csdn.net/article/details/91127897

    class Solution {
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            vector<int> flag(numCourses,0);
            vector<vector<int>> tmp(numCourses);
            if(prerequisites.empty()) return true;
            for(int i=0;i<prerequisites.size();i++){
                tmp[prerequisites[i][0]].push_back(prerequisites[i][1]);
            }
            bool ans=true;
            for(int i=0;i<numCourses;i++){
                ans = ans&&DFS(i,flag,tmp);
            }
            return ans;
        }
        bool DFS(int i,vector<int> &flag,vector<vector<int>> &tmp){//注意要加上"&"
            if(flag[i]==-1){
                return false;
            }
            if(flag[i]==1){
                return true;
            }
            //第一次的入口:
            flag[i]=-1;
            for(int j=0;j<tmp[i].size();j++){
                if(DFS(tmp[i][j],flag,tmp)){
                    continue;
                }
                return false;
            }
            flag[i]=1;
            return true;
        }
    };

     解法2:

    方法二:根据入度判断
    课程先后顺序可以理解为一个有向图,有解的条件是此图无环。因此我们可以依据其先后顺序构造有向图,并统计每门课程的入度(即其前一门课程的数量)。

    然后将入度为0的所有课程压入栈中,然后将这些课程的下一门课程的入度减1,减完后入度为0则入栈。重复上述操作直到栈为空。 如果最后存在入度不为为0的节点就说明有环,无解。

    《算法笔记》也有这个算法

    class Solution {
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            vector<int> indegree(numCourses);
            vector<vector<int>>Graph(numCourses);
            queue<int> ZeroQ;
            vector<int> ans,empty;//结果数组
            int i,j,cnt=0;
            int start,end;
            //初始化邻接矩阵
            for(i=0;i<prerequisites.size();i++){
                start=prerequisites[i][0];
                end=prerequisites[i][1];
                Graph[end].push_back(start);
                indegree[start]++;
            }
            //初始化队列
            for(i=0;i<numCourses;i++){
                if(indegree[i]==0){
                    ZeroQ.push(i);
                }
            }
            while(!ZeroQ.empty()){
                int v=ZeroQ.front();
                ans.push_back(v);
                ZeroQ.pop();
                cnt++;
                for(j=0;j<Graph[v].size();j++){
                    int u=Graph[v][j];
                    indegree[u]--;
                    if(indegree[u]==0){
                        ZeroQ.push(u);
                    }
                }
            }
            if(cnt!=numCourses){
                return false;
            }
            return true;
            
        }
    };

    2019-09-28 09:44:28

    简化到不能再简

    class Solution {
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
             vector<vector<int>> G(numCourses);
            vector<int> degree(numCourses, 0), bfs;
            for (auto& e : prerequisites)
                G[e[1]].push_back(e[0]), degree[e[0]]++;
            for (int i = 0; i < numCourses; ++i) if (!degree[i]) bfs.push_back(i);
            for (int i = 0; i < bfs.size(); ++i)
                for (int j: G[bfs[i]])
                    if (--degree[j] == 0) bfs.push_back(j);
            return bfs.size() == numCourses;
        }
    };

    第二天:

    class Solution {
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            vector<vector<int>> graph(numCourses);
            vector<int> inDegree(numCourses,0);
            for(auto& edge : prerequisites){
                graph[edge[1]].push_back(edge[0]);
                ++inDegree[edge[0]];
            }
            vector<int> result;
            for(int i=0;i<numCourses;++i){
                if(inDegree[i]==0) result.push_back(i);
            }
            for(int i=0;i<result.size();++i){
                for(auto j : graph[result[i]]){
                    if(--inDegree[j]==0) result.push_back(j);
                }
            }
            return result.size()==numCourses;
        }
    };

     还是把自己想得太厉害了。然而自己并不能过目不忘。还是要多敲代码,多巩固,真的感觉到了如果能把自己做过的题保证大部分能做对,真的已经很厉害了。


    这个题的代码和上个题完全一样。只是输出换了。

    解法1:

    队列

    class Solution {
    public:
        vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            vector<int> indegree(numCourses);
            vector<vector<int>>Graph(numCourses);
            queue<int> ZeroQ;
            vector<int> ans,empty;//结果数组
            if(numCourses==1){
                empty.push_back(0);
                return empty;
            }
            int i,j,cnt=0;
            int start,end;
            //初始化邻接矩阵
            for(i=0;i<prerequisites.size();i++){
                start=prerequisites[i][0];
                end=prerequisites[i][1];
                Graph[end].push_back(start);
                indegree[start]++;
            }
            //初始化队列
            for(i=0;i<numCourses;i++){
                if(indegree[i]==0){
                    ZeroQ.push(i);
                }
            }
            while(!ZeroQ.empty()){
                int v=ZeroQ.front();
                ans.push_back(v);
                ZeroQ.pop();
                cnt++;
                for(j=0;j<Graph[v].size();j++){
                    int u=Graph[v][j];
                    indegree[u]--;
                    if(indegree[u]==0){
                        ZeroQ.push(u);
                    }
                }
            }
            if(cnt!=numCourses){
                return empty;
            }
            return ans;
        }
    };

     简化版:

    2019-09-28

    10:32:15

    class Solution {
    public:
        vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            vector<int> result;//最优答案
            vector<int> empty;//空数组
            queue<int> temp;//存储入度为0的节点
            if(numCourses==0){
                empty.push_back(0);
                return empty;
            }
            vector<vector<int>> graph(numCourses);
            vector<int> inDegree(numCourses,0);
            for(auto& edge : prerequisites){
                graph[edge[1]].push_back(edge[0]);
                inDegree[edge[0]]++;
            }
            for(int i=0;i<numCourses;++i){
                if(!inDegree[i]){
                    temp.push(i);
                }
            }
            int cnt=0;
            while(!temp.empty()){
                int pre = temp.front();result.push_back(pre);temp.pop();
                ++cnt;
                for(auto i : graph[pre]){
                    if(--inDegree[i]==0) temp.push(i);
                }
            }
            if(cnt!=numCourses) return empty;
            return result;
        }
    };

     2019-09-30

    09:21:49

     染色问题。

    看的评论:采用了贪心算法。

    class Solution {
    public:
        vector<int> gardenNoAdj(int N, vector<vector<int>>& paths) {
            vector<vector<int>> result(N);
            vector<int> color(N,1);
            for(auto path : paths){
                result[max(path[0],path[1])-1].push_back(min(path[0],path[1])-1);
            }
            for(int i=1;i<N;++i){
                set<int> set_color{1,2,3,4};
                for(int j=0;j<result[i].size();++j){
                    set_color.erase(color[result[i][j]]);
                }
                color[i] = *set_color.begin();
            }
            return color;
        }
    };

    2019-10-04

    11:40:54

     

     解法1:Dijkstra算法

    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int N, int K) {
            vector<vector<int>> v(N+1,vector<int>(N+1,-1));
            for(int i=0;i<times.size();i++){
                v[times[i][0]][times[i][1]]=times[i][2];
            }
            vector<int> S(N+1,-1),T(N+1,-1);
            for(int i=1;i<N+1;i++)
                T[i]=v[K][i];
            T[K]=0;
            int min_val=-1,min_idx=-1;
            for(int c=0;c<N;c++){
                //find min_val of T
                min_val=-1;
                for(int i=1;i<T.size();i++){
                    if(T[i]!=-1&&S[i]==-1){
                        if(min_val==-1||T[i]<min_val){
                            min_idx=i;
                            min_val=T[i];
                        }
                    }
                }
                S[min_idx]=min_val;
                //update
                for(int i=1;i<T.size();i++){
                    if(v[min_idx][i]!=-1&&(min_val+v[min_idx][i]<T[i]||T[i]==-1)){
                        T[i]=min_val+v[min_idx][i];
                    }  
                }
            }
            int res=-1;
            for(int i=1;i<S.size();i++){
                if(S[i]==-1)
                    return -1;
                res=max(res,S[i]);
            }   
            return res;
        }
    };

    解法2:

    2019-10-09(第二次)

    Bellman-Ford算法

    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int N, int K) {

    //Bellman-Ford算法
    //存储图用邻接表,邻接矩阵需要遍历需要增加O(N)复杂度,将会升为O(N三次方)

    
            vector<int> D(N+1,-1);
            D[K] = 0;
            for(int c=0;c<N-1;++c){  //只需要N-1 轮就可以,因为D[K] 为0,是已知的 
                for(int j=0;j<times.size();++j){
                    int src = times[j][0],des = times[j][1],d = times[j][2];
                    if(D[src]!=-1&&(D[src]+d<D[des]||D[des]==-1))
                        D[des]=D[src]+d;
                }
            }
            int res = -1;
            for(int i=1;i<D.size();i++){
                if(D[i]==-1){
                    return -1;
                }
                else res = max(res,D[i]);
            }
            return res;
        }      
    };

     2019-10-05

    09:40:27

    解法3:

    Bellman-Ford 算法的优化版——SPFA(Shorest path Faster Algorithm)算法

    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int N, int K) {
            vector<vector<int>> v(N+1,vector<int>(N+1,-1));
            for(int i=1;i<v.size();++i){
                v[i][i]=0;
            }
            for(int i=0;i<times.size();++i){
                v[times[i][0]][times[i][1]] = times[i][2];
            }
            vector<int> D(N+1,-1);
            D[K] = 0;
            queue<int> q;
            q.push(K);
            while(!q.empty()){
                auto temp = q.front();
                q.pop();
                for(int i=1;i<v.size();++i){
                    if(v[temp][i]!=-1 &&(v[temp][i]+D[temp]<D[i]||D[i]==-1)){
                        D[i] = v[temp][i] + D[temp];
                        q.push(i);
                    }
                }
            }
            int res = 0;
            for(int i=1;i<N+1;++i){
                if(D[i]==-1){
                    return -1;
                }
                res = max(D[i],res);
            }
            return res;
        }      
    };

    解法4:

    Floyd 算法,可用来解决全源最短路问题

    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int N, int K) {
            vector<vector<int>> v(N+1,vector<int>(N+1,-1));
            for(int i=1;i<v.size();++i){
                v[i][i]=0;
            }
            for(int i=0;i<times.size();++i){
                v[times[i][0]][times[i][1]] = times[i][2];
            }
            for(int c=1;c<N+1;++c){
                for(int i=1;i<N+1;++i){
                    for(int j=1;j<N+1;++j){
                        if(v[i][c]!=-1 && v[c][j]!=-1 &&(v[i][c]+v[c][j]<v[i][j]||v[i][j]==-1)){
                            v[i][j] = v[i][c]+v[c][j];
                        }
                    }
                }
            }
            int res = 0;
            for(int i=1;i<N+1;++i){
                if(v[K][i]==-1){
                    return -1;
                }
                res = max(v[K][i],res);
            }
            return res;
        }      
    };

    解法1:

    自己写的广搜判断是否是连通图

     

    class Solution {
    public:
        bool canVisitAllRooms(vector<vector<int>>& rooms) {
            vector<vector<int>> temp(rooms.size());
            for(int i=0;i<rooms.size();++i){//初始化图
                for(int j=0;j<rooms[i].size();++j){
                    temp[i].push_back(rooms[i][j]);
                }
            }
            queue<int> q;
            q.push(0);
            vector<int> result(rooms.size(),0);
            result[0] = 1;
            while(!q.empty()){
                int c = q.front();
                q.pop();
                for(auto cnt : temp[c]){
                    if(result[cnt]!=1){
                        result[cnt] = 1;
                        q.push(cnt);
                    }
                }
            }
            for(int i=0;i<rooms.size();++i){
                if(result[i]==0){
                    return false;
                }
            }
            return true;
        }
    };

    精简版代码:

    class Solution {
    public:
        bool canVisitAllRooms(vector<vector<int>>& rooms) {
            queue<int> q;
            unordered_set<int> visited;
            q.push(0);
            visited.insert(0);
            while(!q.empty()){
                int t = q.front();q.pop();
                visited.insert(t);
                for(auto key : rooms[t]){
                    if(visited.count(key)) continue;
                    q.push(key);
                }
            }
            return visited.size() == rooms.size();
        }
    };

    解法2:DFS

    劣质粗糙代码:

    class Solution {
    public:
        int count = 0;
        void dfs(int x,int N,vector<int> &visited,vector<vector<int>> rooms){
            visited[x] = 1;
            ++count;
            for(int i=0;i<rooms[x].size();++i){
                if(!visited[rooms[x][i]]){
                    dfs(rooms[x][i],N,visited,rooms);
                }
            }
        }
        bool canVisitAllRooms(vector<vector<int>>& rooms) {
            int N = rooms.size();
            vector<int> visited(N,0);
            dfs(0,N,visited,rooms);
            return count == rooms.size();
        }
    };

     解法1:

    自己:

    找到出度为0和入度为N-1的点,此点即为法官。

     思路:构建一个出度数组和一个入度数组。

    class Solution {
    public:
        int findJudge(int N, vector<vector<int>>& trust) {
            vector<int> inDegree(N+1,0);
            vector<int> outDegree(N+1,0);
            for(auto edge : trust){
                inDegree[edge[1]]++;
                outDegree[edge[0]]++;
            }
            for(int i=1;i<N+1;++i){
                if(outDegree[i]==0 && inDegree[i]==N-1){
                    return i;
                }
            }
            return -1;
        }
    };

     

    解法1:看的评论,自己没想到,自己对DFS的掌握还是不够

    思路:DFS染色法,判断拓扑排序中是否有环,并找出不在环内的点(感觉和207,208题有些类似哦,都是判断拓扑排序中是否存在环)

    DFS一直往前走,却走回了走过的结点不就是有环了嘛.

     代码如下:

    #define CIRCLE  1
    #define TERMINAL  2
    class Solution {
    public:
        vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
            int n = graph.size();
            vector<int> v(n);
            vector<int> cnt;
            for(int i=0;i<n;++i){
                if(dfs(graph,v,i)==TERMINAL){
                    cnt.push_back(i);
                }
            }
            return cnt;
        }
        int dfs(vector<vector<int>>& g,vector<int>& v,int i){
            if(v[i]) return v[i];
            v[i] = CIRCLE;
            for(auto edge : g[i]){
                if(dfs(g,v,edge)==CIRCLE){
                    return CIRCLE;
                }
            }
            return v[i] = TERMINAL;
        }
    };

    解法2:

    BFS,和DFS的思路有很大不同。感觉两种方法的着手点是截然不同的。BFS是从入度,出度考虑的。

    class Solution {
    public:
        vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
            vector<int> res, outDegree(graph.size(),0);
            vector<vector<int>> inDegree(graph.size());
            for(int i=0;i<graph.size();++i){//初始化入队的vector<vector<int>>
                for(int j : graph[i]){
                    inDegree[j].push_back(i);
                    outDegree[i]++;
                }
            }
            for(int i=0;i<graph.size();++i){
                if(outDegree[i]==0){
                    res.push_back(i);
                }
            }
            int idx = 0;
            while(idx < res.size()){
                int i = res[idx];
                ++idx;
                for(auto j : inDegree[i]){
                    outDegree[j]--;
                    if(outDegree[j]==0){
                        res.push_back(j);
                    }
                }
            }
            sort(res.begin(),res.end());
            return res;
            
            
        }
    };

    简化版:

    class Solution {
    public:
        vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
            vector<int> res, outDegree(graph.size(),0);
            vector<vector<int>> inDegree(graph.size());
            for(int i=0;i<graph.size();++i){//初始化入队的vector<vector<int>>
                for(int j : graph[i]){
                    inDegree[j].push_back(i);
                }
                outDegree[i] = graph[i].size();
                if(outDegree[i]==0){
                    res.push_back(i);
                }            
            }
            int idx = 0;
            while(idx < res.size()){
                int i = res[idx];
                ++idx;
                for(auto j : inDegree[i]){
                    outDegree[j]--;
                    if(outDegree[j]==0){
                        res.push_back(j);
                    }
                }
            }
            sort(res.begin(),res.end());
            return res;
        }
    };

     为下面代码做铺垫的新知识:

     https://www.cnblogs.com/hustfeiji/articles/5174983.html

     这就是说multiset内部是自动排好序的。

    解法1:

    思路:DFS

     

    class Solution {
    public:
        map<string, multiset<string>> targets;
        vector<string> route;
        vector<string> findItinerary(vector<vector<string>>& tickets) {
            for (auto ticket : tickets)
                targets[ticket[0]].insert(ticket[1]);
            visit("JFK");
            return vector<string>(route.rbegin(), route.rend());
        }
    
    void visit(string airport) {
        while (targets[airport].size()) {
            string next = *targets[airport].begin();
            targets[airport].erase(targets[airport].begin());
            visit(next);
        }
        route.push_back(airport);
    }
    
    };

    本题是一道树的题目。

    就是返回每层各个元素相加和的最大的那个层 

    法1:

    BFS

    class Solution {
    public:
        int maxLevelSum(TreeNode* root) {
            queue<TreeNode*> q;
            q.push(root);
            int maxv=root->val,res=1,layer=0;
            while(!q.empty()){
                layer++;
                int n=q.size(),sum=0;
                for(int i=0;i<n;i++){
                    TreeNode* tmp=q.front();q.pop();
                    sum+=tmp->val;
                    if(tmp->left) q.push(tmp->left);
                    if(tmp->right) q.push(tmp->right);
                }
                if(sum>maxv){
                    maxv=sum;
                    res=layer;
                }
            }
            return res;
        }
    };

    法2:

    DFS:

    借助map结构,遍历到各个层时,map[n] 就加上那个属于本层的节点的元素值。 

    class Solution {
    public:
        map<int,int> mp;
        void dfs(TreeNode* root, int d){
            if(!root){
                return;
            }
            mp[d] += root->val;
            dfs(root->left,d+1);
            dfs(root->right,d+1);
        }
        int maxLevelSum(TreeNode* root) {
            int res = 0, max_sum = INT_MIN;
            dfs(root,1);
            auto iter = mp.begin();
            while(iter != mp.end()){
                if(iter->second > max_sum){
                    max_sum = iter->second;
                    res = iter->first;
                }
                iter++;
            }
            return res;
        }
    };

     解法1:

    并查集

    题目很拗口。。。但本质就是计算一个图的连通分量的个数,总石头数减去连通分量个数就是结果。

    每次move移除掉一个共享同一行或列的(两个或多个石头)中的一个 如果把每个石头当一个点,如果两个石头间有共同x或y坐标,就给这两个点画一条线(边)。那么对应move操作就是把其中一条边的一个点删除,直到不能删为止,也就是说图里面的连通分量的点是要删去的,一直删到连通分量里面没有边(即只剩下一个点)

     

    class Solution {
    public:
        vector<int> vec;
        int removeStones(vector<vector<int>>& stones) {
            int n = stones.size();
            vec = vector<int>(n);
            for(int i=0;i<n;++i){
                vec[i] = i;
            }
            for(int i=0;i<n;++i){
                for(int j=0;j<n;++j){
                    if(stones[i][0] == stones[j][0] || stones[i][1] == stones[j][1]){
                        Union(i,j);
                    }
                }
            }
            int cnt=0;
            for(int i=0;i<n;++i){
                if(vec[i]==i){
                    cnt++;
                }
            }
            return n - cnt;
        }
        int find(int i){
            if(vec[i]!=i){
                vec[i] = find(vec[i]);
            }
            return vec[i];
        }
        void Union(int x,int y){
            int faA = find(x);
            int faB = find(y);
            vec[faA] = faB;
        }
    };

    解法2:

    DFS

    DFS方法的解题思路: 用dfs求连通分量的个数 最后结果 = stones.size() - 连通分量的个数

    class Solution {
    public:
        int removeStones(vector<vector<int>>& stones) {
            vector<bool> vis(stones.size(),false);
            int res = 0;
            for(int i=0;i<stones.size();++i){
                if(vis[i]==true){
                    continue;
                }
                dfs(stones,vis,i);
                res++;
            }
            return stones.size()-res;
        }
        void dfs(vector<vector<int>>& stones,vector<bool>& vis,int k){
            vis[k] = true;
            int x = stones[k][0], y = stones[k][1];
            for(int i=0;i<stones.size();++i){
                if(vis[i]==true)
                    continue;
                if(stones[i][0] == x || stones[i][1]==y){
                    dfs(stones,vis,i);
                }
            }
        }
    };

     

    解法1:

    并查集

     

    class Solution {
    public:
        
        int find(vector<int>& union_find, int idx){
            if(union_find[idx] == -1)   return idx;
            return find(union_find,union_find[idx]);
        }
        
        void Union(vector<int>&union_find, int idx1, int idx2){
            int parent1 = find(union_find,idx1);
            int parent2 = find(union_find,idx2);
            //Always keep the same rule, merge parent1 to parent2;
            if(parent1 != parent2)  union_find[parent1] = parent2;
        }
    
        vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
            vector<vector<string>> res;
            int n = accounts.size();
            
            vector<int> union_find(n,-1);
            map<string,int> mailUser;
            map<int,vector<string>> mails;
            
            for(int i=0; i<accounts.size(); i++){
                for(int j=1; j<accounts[i].size(); j++){
                    if(mailUser.count(accounts[i][j])){
                        // if the same email has been stored before, find its user and unite them
                        int idx1 = find(union_find,i);
                        int idx2 = find(union_find,mailUser[accounts[i][j]]);
                        Union(union_find,idx1,idx2);
                    }
                    //**IMPORTANT** 
                    //We can still assign this mail to the "current" user, because we have already performed union
                    mailUser[accounts[i][j]] = i;
                }
            }
            
            for(auto pair:mailUser){
                //Find its real user
                int user = find(union_find,pair.second);
                mails[user].push_back(pair.first);
            }
            
            for(auto pair:mails){
                vector<string> temp = pair.second;
                sort(temp.begin(),temp.end());
                temp.insert(temp.begin(),accounts[pair.first][0]);
                res.push_back(temp); 
            }
            
            return res;
        }
    };

     

    解法1:
    DFS C++

     

    class Solution {
    private:
        unordered_map<string,vector<pair<string,double>>> children;
        pair<bool,double> search(string& a,string& b,unordered_set<string>& visited,double val){
            if(visited.count(a) == 0){
                visited.insert(a);
                for(auto p : children[a]){
                    double temp = val * p.second;
                    if(p.first == b) return make_pair(true,temp);
                    auto result = search(p.first,b,visited,temp);
                    if(result.first){
                        return result;
                    }
                }
            }
            return make_pair(false,-1.0);
        }
    public:
        vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
            vector<double> ans;
            for(int i = 0;i<equations.size();++i){
                children[equations[i][0]].push_back(make_pair(equations[i][1],values[i]));
                children[equations[i][1]].push_back(make_pair(equations[i][0],
                                                                  1.0 / values[i]));
            }
            for(auto p : queries){
                unordered_set<string> visited;
                // p .first == p.second is special case
                ans.push_back(p[0] == p[1] && children.count(p[0]) ? 
                              1.0 : search(p[0],p[1],visited,1.0).second);
            }
            return ans;
            
        }
    };

     

     

    class Solution {
    public:
        int maxPoints(vector<vector<int>>& points) {
            //两点确定一条直线
            if(points.size()<3)return points.size();
            
            int Max=0;
            for(int i=0;i<points.size();++i)//i表示数组中的第i+1个点
            {
                //same用来表示和i一样的点
                int same=1;
                for(int j=i+1;j<points.size();++j)//j表示数组中的第j+1个点
                {
                    int count=0;
                    // i、j在数组中是重复点,计数
                    if(points[i][0]==points[j][0]&&points[i][1]==points[j][1])same++;
                    else{//i和j不是重复点,则计算和直线ij在一条直线上的点
                        count++;
                        long long xDiff = (long long)(points[i][0] - points[j][0]);//Δx1
                        long long yDiff = (long long)(points[i][1] - points[j][1]);//Δy1
                        
                        for (int k = j + 1; k < points.size(); k ++)//Δy1/Δx1=Δy2/Δx2 => Δx1*Δy2=Δy1*Δx2,计算和直线ji在一条直线上的点
                            if (xDiff * (points[i][1] - points[k][1]) == yDiff * (points[i][0] - points[k][0]))
                                count++;
                    }
                    Max=max(Max,same+count);
                }
                if(Max>points.size()/2)return Max;//若某次最大个数超过所有点的一半,则不可能存在其他直线通过更多的点
            }
            return Max;
        }
    };

  • 相关阅读:
    ZOJ2334 Monkey King 并查集 STL
    ZOJ2286 Sum of Divisors 筛选式打表
    ZOJ2105 终于找到错误
    ZOJ-2091-Mean of Subsequence (反证法的运用!!)
    【9929】潜水员
    【9928】混合背包
    【t077】宝物筛选
    【9927】庆功会
    【9926】完全背包
    【9925】0/1背包
  • 原文地址:https://www.cnblogs.com/JasonPeng1/p/12110098.html
Copyright © 2011-2022 走看看