Leetcode周赛277

2022/2/1 6:57:50

本文主要是介绍Leetcode周赛277,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  • 未掌握:二进制枚举 状态压缩

目录
  • # 元素计数
  • # 找出数组中所有孤独数字
  • # 按符号重排数组
  • # 基于陈述统计的最多好人数

# 元素计数

【传送门】:https://leetcode-cn.com/problems/count-elements-with-strictly-smaller-and-greater-elements/

签到题,排序后遍历一下就可以了

solution:

class Solution {
public:
    int countElements(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int ans=0;
        for(int i=1;i<n;i++)
        {
            if(nums[i]>nums[0]&&nums[i]<nums[n-1]) {ans++;}
        }
        return ans;
    }
};

# 找出数组中所有孤独数字

【传送门】:https://leetcode-cn.com/problems/find-all-lonely-numbers-in-the-array/

签到题,进行排序后遍历就可以了

solution:

ps:写的有点丑,但是为了a题,也就是无所谓啦

class Solution {
public:
    vector<int> findLonely(vector<int>& nums) {
        int n=nums.size();
        vector<int> ans;
        if(n==1) 
        {
            ans.push_back(nums[0]);
         return ans;   
        }
        sort(nums.begin(),nums.end());
        for(int i=0;i<n;i++)
        {
            if(i==0)
            {
                if(nums[i]!=nums[i+1]&&nums[i]+1!=nums[i+1]&&nums[i]-1!=nums[i+1])
                    ans.push_back(nums[i]);
            }
            else if(i==n-1)
            {
                if(nums[i]!=nums[i-1]&&nums[i]+1!=nums[i-1]&&nums[i]-1!=nums[i-1])
                    ans.push_back(nums[i]);
            }
            else
            {
                if(nums[i]!=nums[i+1]&&nums[i]+1!=nums[i+1]&&nums[i]-1!=nums[i+1]&&nums[i]!=nums[i-1]&&nums[i]+1!=nums[i-1]&&nums[i]-1!=nums[i-1])
                    ans.push_back(nums[i]);
            }
        }
        return ans;
    }
};

# 按符号重排数组

【传送门】:https://leetcode-cn.com/problems/rearrange-array-elements-by-sign/

签到题,无语了,直接遍历,存一下就好了。

solution:

class Solution {
public:
    vector<int> rearrangeArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> da(n/2);
        vector<int> xiao(n/2);
        int cnt1=0,cnt2=0;
        for(int i=0;i<n;i++)
        {
            if(nums[i]>0) {da[cnt1++]=nums[i];}
            else {xiao[cnt2++]=nums[i];}
        }
        cnt1=0,cnt2=0;
        int count=1;
        for(int i=0;i<n;i++)
        {
            nums[i]=count%2==0?xiao[cnt2++]:da[cnt1++];
            count++;
        }
        return nums;
    }
};

# 基于陈述统计的最多好人数

【传送门】:https://leetcode-cn.com/problems/maximum-good-people-based-on-statements/

题目出到了知识盲点,考察状态压缩与二进制枚举,观察题目数据范围并不大,所以可以直接采用暴力搜索即可

solution:

class Solution {
   public:
    int maximumGood(vector<vector<int>>& s) {
        int n = s.size();
        int mask = (1 << n);
        int ans = 0;
        for (int i = 0; i < mask; i++) 
        {  // 考虑 0 到 2^n - 1 种情况中的值
            bool flag = true;
            for (int j = 0; j < n; j++) 
            { // 对于每一个值考虑每一位具体是 0 还是 1 
                if ((i >> j) & 1)
                {       // 如果 i 的第 j 位等于 1, 就说明这种 mask 中的这一位存在
                                          // j 是好人的情况下,根据 statesment[j][k] 计算其他人是好人还是坏人
                    for (int k = 0; k < s[j].size(); k++) 
                    {
                        if (s[j][k] == 2) continue;
                        if ((s[j][k] == 1 && ((i >> k) & 1) == 0) ||
                            (s[j][k] == 0 && ((i >> k) & 1) == 1)) 
                        {
                                          // 如果出现了陈述的状态和当前 mask 表示的状态不同的情况
                            flag = false;
                            break;        // 就可以快进到下一种情况
                        }
                    }
                }
            }
            if (flag) {                   // 如果存在一种 mask 正确的遍历完成的话
                ans = max(ans, __builtin_popcount(i));
                //——builtin_popcount(i)----->找到并输出i的二进制1的个数
            }
        }
        return ans;
    }
};


这篇关于Leetcode周赛277的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程