leetcoder刷题总结(一)

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值