- 整数的各位积和之差
水题
class Solution {
public int subtractProductAndSum(int n) {
int x=n;
int cnt1=0;
int cnt2=1;
while(x!=0){
int y=x%10;x/=10;
cnt1+=y;cnt2*=y;
}
return cnt2-cnt1;
}
}
- 用户分组
暴力
class Solution {
public:
bool pd[505];
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
vector<vector<int>> ans;
int n=groupSizes.size();
for(int i=0;i<n;i++){
if(!pd[i]){
vector<int> p;
pd[i]=true;p.push_back(i);
int hx=groupSizes[i];
int cnt=groupSizes[i]-1;
int j=i+1;
while(j<n&&cnt!=0){
if(!pd[j]&&groupSizes[j]==hx){
cnt--;pd[j]=true;p.push_back(j);
}
j++;
}
ans.push_back(p);
}
}
return ans;
}
};
- 使结果不超过阈值的最小除数
二分
class Solution {
int pd(vector<int> &nums, int divisor) {
int sum = 0;
for (int num : nums) {
sum += (num + divisor - 1) / divisor;
}
return sum;
}
public:
int smallestDivisor(vector<int> &nums, int threshold) {
int maxVal = 1;
for (int num : nums) {
maxVal = max(maxVal, num);
}
int left = 1;
int right = maxVal;
int ans;
while (left <=right) {
int mid = (left + right) / 2;
if (pd(nums, mid) > threshold) {
left = mid + 1;
} else {
ans=mid;
right = mid-1;
}
}
return ans;
}
};
- 转化为全零矩阵的最少反转次数
bfs
class Solution {
public:
int hp[4][4];
int next[4][4];
int x[4]={1,0,-1,0};int y[4]={0,1,0,-1};
int minFlips(vector<vector<int>>& mat) {
int n=mat.size();int m= mat[0].size();
queue<string> q;
string r;
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
r+=mat[i][j]+'0';
}
int cnt=0;
unordered_map<string,int> mp;
q.push(r);
// cout<<r<<endl;
mp[r]=1;
while(!q.empty()){
int sz=q.size();
for(int pnt=0;pnt<sz;pnt++){
string h=q.front();q.pop();
bool fg=true;
printf("%d:\n",cnt);
//cout<<h<<endl;
int js=0;
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
hp[i][j]=h[js++]-'0';next[i][j]=hp[i][j];
if(hp[i][j]==1)fg=false;
}
if(fg)return cnt;
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
hp[i][j]^=1;
for(int k=0;k<4;k++){
int dx=i+x[k];int dy=j+y[k];
if(dx<0||dx>=n||dy<0||dy>=m)continue;
hp[dx][dy]^=1;
}
string nd;
for(int s=0;s<n;s++)for(int t=0;t<m;t++)nd+=hp[s][t]+'0';
//cout<<"yu::"<<nd<<endl;
if(mp[nd]==0){
mp[nd]=1;q.push(nd);
}
for(int s=0;s<n;s++)for(int t=0;t<m;t++)hp[s][t]=next[s][t];
}
}
cnt++;
}
return -1;
}
};