- 未掌握:二进制枚举 状态压缩
# 元素计数
【传送门】: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;
}
};