当前位置: 首页 > article >正文

力扣习题笔记

781. 森林中的兔子

781. 森林中的兔子 - 力扣(LeetCode)

 代码

从数字相同,到 采用映射的存储结构,如:unordered_map<int,int>

class Solution {
public:
    int numRabbits(vector<int>& answers) {
        //两只相同颜色的兔子,看到其他相同颜色兔子数是相同的,相反,不同。
        unordered_map<int,int> count;
        for(int y : answers) {
            ++ count[y];
        }
        int ans = 0;
        for(auto &[y,x] : count) {
            ans += (x+y)/(y+1)*(y+1);
            // y+1就是回答y只其他相同颜色,加自身
            // x/y 的向上取整: (x+ y-1)/y  
            // x/(y+1) : (x + y)/(y+1)
        }
        return ans;
    }
};

868. 二进制间距

 代码

class Solution {
public:
    int binaryGap(int n) {
        int last = -1, ans = 0;
        for(int i = 0; n; i ++) {
            if(n&1) {//奇数
                if(last!=-1) { // 为了防止只有一个1
                    ans = max(ans, i - last);
                }
                last = i;
           }
            n >>= 1;
        }
        return ans;
    }
};

994. 腐烂的橘子

994. 腐烂的橘子 - 力扣(LeetCode)

代码

class Solution {
    int cnt; // 记录新鲜橘子数,为了判断是否还有新鲜橘子
    int dis[10][10]; // 标记时间,刚开始时间是-1,腐烂橘子时间标记为0,开始的意思
    int x[4] = {0,1,0,-1};
    int y[4] = {1,0,-1,0};
public:
    int orangesRotting(vector<vector<int>>& grid) {
        queue<pair<int,int>> q;
        memset(dis,-1,sizeof(dis));
        // ans 记录时间 : 答案
        int n = grid.size(), m = grid[0].size(), ans = 0;
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < m; j ++) {
                if(grid[i][j] == 2) {  // 腐烂橘子
                    q.emplace(i,j); // 入队
                    dis[i][j] = 0; //第0分钟,初始腐烂橘子
                }
                else if(grid[i][j] == 1) { //新鲜橘子
                    cnt += 1;
                }
            }
        }

        while(!q.empty()) {
            auto [r,c] = q.front();
            q.pop();
            
            for(int i = 0 ; i < 4; i ++) {
                int tx = r + x[i], ty = c + y[i];
                //-1取反是0 : -1补码为全1
                //grid【tx】【ty】 为0时,代表没橘子
                //dis为-1 时 : 代表不是腐烂的 : 没橘子或者新鲜橘子
                //-1取反为0,不跳过,因为新鲜或者没橘子
                // 没橘子跳过, 腐烂橘子跳过, 只要新鲜橘子
                if(tx<0||tx>=n||ty<0||ty>=m||~dis[tx][ty]||!grid[tx][ty]) continue;

                dis[tx][ty] = dis[r][c] + 1; // 时间+1
                q.emplace(tx, ty);
                // 新鲜橘子数更新, 答案更新(时间递推)
                cnt -= 1;
                ans = dis[tx][ty];
                if(!cnt) break; //没有新鲜橘子
                
            }
        }

        return cnt ? -1 : ans;
    }
};


http://www.kler.cn/a/554119.html

相关文章:

  • Sklearn常用算法及建模流程总结
  • element-plus树形数据与懒加载的实现
  • matlab下载安装图文教程
  • Excel核心函数VLOOKUP全解析:从入门到精通
  • 51单片机学习之旅——定时器
  • Jetson AGX 安装 VScode 教_ubuntu1804
  • J3打卡——DenseNet模型实现鸟类分类
  • Linux软硬链接与动静态库
  • 调用deepseek接口
  • ⭐ Unity 横向滑动列表 首尾相连 轮转图
  • Rust 面试题
  • 机器学习·数据处理
  • 【Python爬虫(17)】突破爬虫IP限制,解锁数据抓取新姿势
  • 【Scrapy】Scrapy教程4——命令行工具
  • 实现一个专注应用-后端开发(一)-搭建
  • QML Image 圆角设置
  • 从猜想终结到算法革新,弹性哈希开启数据存储新篇章
  • docker run --ipc=host参数含义
  • UniApp 面试题 超基础
  • C++效率掌握之STL库:vector函数全解