lc2405
hash
class Solution {
public:
int partitionString(string s)
{
unordered_set<char> set;
int ret = 0;
for(auto& c : s)
{
++if(set.count(c))++
{
ret++;
set.clear();
}
set.insert(c);
}
++ret += 1;//last++
return ret;
}
};
mask位运算优化set
++if(mask & (1 << bit))++ // 查1
++mask |= (1 << bit); //置1++
class Solution {
public:
int partitionString(string s)
{
int mask = 0; // 用二进制位标记字符是否出现:第i位为1表示'a'+i已存在
int ret = 0;
for(auto& c : s)
{
int bit = c - 'a';
++if(mask & (1 << bit))++ // 查1
{
ret += 1;
mask = 0; // 重置mask
}
++mask |= (1 << bit); //置1++
}
ret += 1;
return ret;
}
};
lc3531
预处理统计每个x行的y最值、y列的x最值
若建筑的x、y都在对应行列最值中间,就是被覆盖的,计数返回。
class Solution {
public:
int countCoveredBuildings(int n, vector<vector<int>>& buildings)
{
//++预处理 行位置极值和列位置极值++
unordered_map<int,int> row_min,row_max;
unordered_map<int,int> col_min,col_max;
for(auto& b:buildings)
{
int x = b[0], y = b[1];
// 预处理行极值
if (!row_min.count(x) || y < row_min[x]) row_min[x] = y;
if (!row_max.count(x) || y > row_max[x]) row_max[x] = y;
// 预处理列极值
if (!col_min.count(y) || x < col_min[y]) col_min[y] = x;
if (!col_max.count(y) || x > col_max[y]) col_max[y] = x;
}
int ans=0;
for(auto& b:buildings)
{
int x=b[0],y=b[1];
bool up=(y<row_max[x]);
bool down=(y>row_min[x]);
bool left=(x>col_min[y]);
bool right=(x<col_max[y]);
++if(up && down && left && right) ans++;++
}
return ans;
}
};
lc16.21
找到去掉差值的一半

class Solution {
/*
输入:array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出:[1, 3]
*/
public:
vector<int> findSwapValues(vector<int>& array1, vector<int>& array2)
{
unordered_map<int,int> hash;
int sum1=0,sum2=0;
int m=array1.size(),n=array2.size();
for(int i=0;i<n;i++)
{
int a=array2[i];
sum2+=a;
hash[a]=i;;
}
for(auto& a:array1)
sum1+=a;
int d=sum1-sum2;
if(d%2) return {};
for(int i=0;i<m;i++)
{
int a=array1[i];
++int f=a-d/2;
if(hash.count(f))++
return {a,f};
}
return {};
}
};