1、1518 换酒问题
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。
如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。
请你计算 最多 能喝到多少瓶酒。
解法:
假设有B个酒瓶,那一定会有B个空瓶,每次用C个空瓶去换一瓶新酒,那空瓶数量++,喝到酒的数量++。直到最后空瓶的数量少于C,即不能兑换新酒了。
class Solution {
public:
int numWaterBottles(int numBottles, int numExchange) {
int bottle = numBottles, ans = numBottles;
while (bottle >= numExchange) {
bottle -= numExchange; # 每次拿C个空瓶去换新酒
++ans;
++bottle;
}
return ans;
}
};
2、419 甲板上的战舰
给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ ,返回在甲板 board 上放置的 战舰 的数量。
战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。
解法:
这里是遍历的问题,不需要考虑深搜等情况。
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m = board.size();
int n = board[0].size();
int ans = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') {
board[i][j] = '.';
for (int k = j + 1; k < n&& board[i][k] == 'X'; ++k) {
board[i][k] = '.'; # 把同行的X变成空
}
for (int k = i + 1; k < m&& board[k][j] == 'X'; ++k) {
board[k][j] = '.'; # 把同列的X变成空
}
ans++;
}
}
}
return ans;
}
};
3、997 找到小镇的法官
思路:这一类型的题目,只要想着满足条件即可。因此,根据条件可以得出,如果有n-1个信任某一个人并且这个人不会出现在a的位置,那这个人就是法官。
class Solution {
public:
int findJudge(int n, vector<vector<int>>& trust) {
int ans=-1;
int len = trust.size();
if(len==0&&n==1) # 如果只有一个人,那这个人直接是法官,这个条件不能忽略
{
return 1;
}
map<int, int> mp;
for(int i=0;i<trust.size();i++) # 先统计每个人被相信几次,法官会被相信n-1次
{
int a = trust[i][0];
int b = trust[i][1];
if(mp.count(b)==0)
{
mp[b]=1;
}else{
mp[b]++;
}
}
map<int, int>::iterator iter;
iter = mp.begin();
while(iter!=mp.end())
{
if(iter->second == (n-1)) # 被相信n-1次的是法官
{
ans=iter->first;
break;
}
iter++;
}
for(int i=0;i<trust.size();i++)
{
int a = trust[i][0];
if(a==ans) # 同时法官不能相信别人
{
ans=-1;
break;
}
}
return ans;
}
};
4、475 供暖器
解题思路:这题没做出来
1、首先水平线,肯定要排序
2、要找到能覆盖所有房屋的最小加热半价,把问题转化为max(每个房屋最近的供暖器距离)
也就是max( min(房屋左边最近的供暖器距离,房屋右边最近的供暖器距离) )
3、要找离房屋最近的供暖器,就想到 二分 (第一个大于XXX的元素)
class Solution {
public:
int findRadius(vector<int> &a