LeetCode第209场周赛(2020/10/04)

本文介绍了三个算法问题的解决方案:首先,通过暴力搜索解决特殊数组的特征值问题;接着,利用层序遍历方法判断二叉树是否为奇偶树;最后,探讨了一个几何问题——如何确定可见点的最大数目,该问题涉及到角度计算和排序。文章提供了详细的代码实现和关键点解析。
摘要由CSDN通过智能技术生成

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;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值