LeetCode第209场周赛(20201004)

    科技2022-07-17  110

    1. 特殊数组的特征值

    思路

    懒得思考,直接暴力

    代码

    class Solution { public: int specialArray(vector<int>& nums) { for(int i=1;i<1010;i++) { int cnt = 0; for(int j=0;j<nums.size();j++) { if(nums[j]>=i) cnt++; } if(cnt==i) return cnt; } return -1; } };

    2. 奇偶树

    思路

    层序遍历(bfs)。设置一些必要的标记,遍历一遍,判断一下就行了。

    代码

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ typedef struct P { TreeNode* node; int level; }P; class Solution { public: bool isEvenOddTree(TreeNode* root) { queue<P> que; que.push({root,0}); int prevlevel = -1; int lastval = 0; while(que.size()) { TreeNode* nex = que.front().node; int level = que.front().level; que.pop(); if(level!=prevlevel) { //奇数层 奇数则false if(level%2==1&&nex->val%2==1) return false; if(level%2==0&&nex->val%2==0) return false; prevlevel = level; lastval = nex->val; } else{ //奇数层 为奇数或递增则false if(level%2==1) { if(nex->val%2==1||nex->val>=lastval) return false; lastval = nex->val; } //偶数层 为偶数或递减 else{ if(nex->val%2==0||nex->val<=lastval) return false; lastval = nex->val; } } if(nex->left) que.push({nex->left,level+1}); if(nex->right) que.push({nex->right,level+1}); } return true; } };

    3. 可见点的最大数目

    思路

    是个几何题,比赛时WA了8次过了前103个点(共120)。需要注意的细节很多。代码参考https://leetcode-cn.com/problems/maximum-number-of-visible-points/solution/atan2jiu-wan-shi-liao-by-time-limit/

    代码

    const double PI = 3.1415926; class Solution { public: int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) { int ans = 0; vector<double> angles; int x = location[0]; int y = location[1]; for(auto point : points) { int dx = point[0] - x; int dy = point[1] - y; if(dx==0&&dy==0) ans++; else angles.emplace_back(atan2(dy,dx)); } sort(angles.begin(),angles.end()); int n = angles.size(); for(int i=0;i<n;i++) angles.emplace_back(angles[i]+2*PI); //int add = 0; int res = 0; double angg = angle*PI/180; for(int i=0,j=0;i<angles.size();i++) { while(j<angles.size()&&(fabs(angles[j]-angles[i]-angg)<1e-8||angles[j]-angles[i]<angg)) j++; res = max(j-i+ans,res); } return res; } };
    Processed: 0.010, SQL: 8