LeetCode 第220场周赛(C++)不含最后一题

第一题

LeetCode 第220场周赛(C++)不含最后一题_第1张图片

暴力: O(N^2)

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

排序+枚举特征值:O(nlogn)

class Solution {
public:
    int specialArray(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin() , nums.end());
        
        for(int i = 0; i <= n; i++)
        {
            // lower_bound(begin , end , i) 在数组begin到end-1的位置找到大于等于i的第一个数的下标
            int t = nums.end() - lower_bound(nums.begin() , nums.end() , i);
            if(t == i) return t;
        }
        
        return -1;
    }
};

第二题

LeetCode 第220场周赛(C++)不含最后一题_第2张图片
LeetCode 第220场周赛(C++)不含最后一题_第3张图片
注释中已写出变量含义。

/**
 * 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) {}
 * };
 */
class Solution {
public:
    bool isEvenOddTree(TreeNode* root) {
        queue<TreeNode*> q;
        // 记录遍历到的树的层数
        int count = 0;
        q.push(root);
        while(q.size())
        {
            int n = q.size();
            // 判断当前层的树节点应该是偶数还是奇数
            int flag = (++count) % 2;
            // 记录上一个数的值
            int last = 0;
            // 遍历这一层的所有点
            for(int i = 0; i < n; i++)
            {
                TreeNode *node = q.front();
                q.pop();
                
                // 判断是否满足层数的奇偶性
                if(node->val % 2 != flag) return false;
                if(node->val % 2 == flag)
                {
                    // 判断是否符合递增或者递减
                    if(flag == 0 && i > 0 && node->val >= last) return false;
                    if(flag == 1 && i > 0 && node->val <= last) return false;
                }
                last = node->val;
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
        }
        return true;
    }
};

第三题

LeetCode 第220场周赛(C++)不含最后一题_第4张图片
LeetCode 第220场周赛(C++)不含最后一题_第5张图片

为什么要将 ange 和 angle + 360 在vector中存储两次。
LeetCode 第220场周赛(C++)不含最后一题_第6张图片

详解为何加上2*pi
LeetCode 第220场周赛(C++)不含最后一题_第7张图片

class Solution {
public:
    int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) {
        int cnt = 0;
        // PI的值可以用acos(-1)来获取
        const double PI = acos(-1);
        vector<double> angles;
        
        for(auto point : points)
        {
            // 如果点和自身重合,直接算入结果
            int x = point[0] - location[0];
            int y = point[1] - location[1];
            if(x == 0 && y == 0) 
            {
                cnt++;
                continue;
            }
            // 算出y和x之间的夹角度数
            double curAngle = atan2(y , x);
            angles.emplace_back(curAngle);
            // 加上2PI的原因在上边有图说明
            angles.emplace_back(curAngle + 2*PI);
        }
		// 从小到大对角度进行排序
        sort(angles.begin() , angles.end());
        // 算出视野的角度范围
        double threshold = angle * PI / 180;
        // 遍历角度的数组,使用双指针算出最大的区间范围。
        int l = 0 , r = 0 , ans = 0;
        while(true)
        {
            if(r == angles.size()) return ans + cnt;
            
            if(angles[r] - angles[l] <= threshold) 
            {
                ans = max(ans , r - l + 1);
                ++r;
            }else{
                ++l;
            }
        }
    }
};

你可能感兴趣的:(leetcode,算法)