LeetCod刷题笔记

目录

 2739.总行驶距离

 思路:模拟

代码

6890.找出分区值

 思路:急转弯

代码:

 1254.统计封闭岛屿的数目​编辑

 思路:DFS

 代码:

6447.给墙壁刷油漆

思路:动态规划

代码: 

思路:状态DP

代码: 

1262.可被三整除的最大和 

 思路:贪心

 代码:


 2739.总行驶距离

 思路:模拟

模拟即可:

每次循环主油箱减去5升

(1)主箱是有5升油,并且副油箱有油则,主油箱加一,副油箱减一。

(2) 主油箱有5升油,副油箱无油,继续下次循环

(3)主油箱没有5升油,返回,答案加上剩余的主箱油即可

代码

class Solution {
public:
    int distanceTraveled(int mainTank, int additionalTank) {
        for(int i=mainTank;i>=5;i-=5){
            if(additionalTank) {
                additionalTank--;
                mainTank++;
                i++;
            }
        }
        return mainTank*10;
    }
};

如果你的代码真是无敌了!那么这件事真的是泰裤辣!!!!!


6890.找出分区值

 思路:急转弯

 (1)sort排序从小到大

 (2)取两两相邻的最小值即可

代码:

class Solution {
public:
    int findValueOfPartition(vector<int>& nums) {
        int len=nums.size();
        sort(nums.begin(),nums.end()); 
        int max_t=INT_MAX;
        for(int i=0;i<len-1;i++){
            max_t=min(nums[i+1]-nums[i],max_t);
            if(max_t==0) return 0;
        }
        return max_t;
    }
};

 这件事真的是泰裤辣!!


 1254.统计封闭岛屿的数目

 思路:DFS

 (1)从网格图的第一行、最后一行、第一列和最后一列的所有 0 出发,DFS 访问四方向的 0,并把这些 0 标记成「访问过」。代码实现时可以直接把 0 修改成 1。

  (2)然后从剩下的 0 出发,按照同样的方式 DFS 访问四方向的 0,同时把 0 改成 1。每次从一个新的 0 出发(起点),就意味着找到了一个新的封闭岛屿,答案加一。

  (3)此外,如果行数或列数不足 3,此时没有封闭岛屿,可以直接返回 0。

 代码:

class Solution {
public:
    //dfs只管填充
    void dfs(vector<vector<int>>& grid,int x,int y){
        int hang=grid.size();
        int lie=grid[0].size();
        if(x<0||y<0||x>=hang||y>=lie||grid[x][y]) return;
        grid[x][y]=1;   //标记已经遍历过
        dfs(grid,x-1,y);
        dfs(grid,x+1,y);
        dfs(grid,x,y-1);
        dfs(grid,x,y+1);
    }
    int closedIsland(vector<vector<int>>& grid) {
        int hang=grid.size();
        int lie=grid[0].size();
        int count=0;
        if(hang<3||lie<3) return 0;
        for(int i=0;i<hang;i++){
            if(i==0||i==hang-1){
                for(int j=0;j<lie;j++){
                    dfs(grid,i,j);
                }
            }else{
                dfs(grid,i,0);
                dfs(grid,i,lie-1);
            }
        }

        for(int i=1;i<hang-1;i++){
            for(int j=1;j<lie-1;j++){
                if(!grid[i][j]){
                    count++;
                    dfs(grid,i,j);
                }
            }
        }
        return count;

    }
};


6447.给墙壁刷油漆

思路:动态规划

dp[i][j]表示墙[0,i]中粉刷至少j面的最小花费,答案应该为dp[n-1][n]。

状态转移

按照01背包的套路,最外层循环是枚举0 <= i < n。内层循环枚举 j(相当于体积):

(1)付费油漆匠刷墙 i,那么免费油漆匠就会刷另外time[i]面墙,付费油漆匠刷完墙 i 花费为cost[i],付费和免费两位油漆匠一共刷了time[i]+1面墙。

状态转移方程为 :dp[i][j]=dp[i-1][j-time[i]-1]+cost[i]

(2)免费油漆匠刷墙i,说明此时付费油漆匠正在刷某一面墙,“墙[0,i]中粉刷至少 j 面的最小花费”与“墙[0,i)中粉刷至少 j 面的最小花费”是一样的。

状态转移方程为:dp[i][j]=dp[i-1][j]。

以上两种情况取较小值进行转移即可。

代码: 

class Solution {
public:
    int paintWalls(vector<int> &cost, vector<int> &time) {
        int n = cost.size(), f[n + 1];
        memset(f, 0x3f, sizeof(f));
        f[0] = 0;
        for (int i = 0; i < n; i++) {
            int c = cost[i], t = time[i] + 1; 
            for (int j = n; j; j--)
                f[j] = min(f[j], f[max(j - t, 0)] + c);
        }
        return f[n];
    }
};

6893.特别的排列

 

思路:状态DP

集合论与位运算(状态DP前缀知识)

首先定义 dfs(i,j) 表示当前可以选的下标集合为 i,上一个选的数的下标是 j 时,可以构造出多少个特别排列。

递归边界:dfs(0,j)=1,表示找到了一个特别排列。

递归入口:dfs(U\{j},j),其中全集 U={0,1,2,⋯,n−1}。枚举特别排列的第一个数的下标 j,累 加所有 dfs(U\{j},j),即为答案。

代码: 

class Solution {
public:
    const int mod=1e9+7;
    //取模用
    int specialPerm(vector<int>& nums) {
        int len=nums.size();
        int U=(1<<len)-1;  
        //全集,1代表还可以进入排列
        int flage[U][len];
        memset(flage,-1,sizeof(flage));
        //标记是否已经判断过
        function<int(int,int)> dfs=[&](int i,int j)->int{
            if(i==0) return 1;
            //整数都用完了
            int& res=flage[i][j];
            if(res!=-1) return res;
            //已经判断过了
            int ans=0;
            for(int k=0;k<len;++k){
                int x=nums[k];
                if((i>>k)&1 && ((nums[j]%x)==0||(x%nums[j]==0))){
                    ans=(ans+dfs(i^(1<<k),k))%mod;
                }
            }
            res=ans;
            return res;
        };

        int res=0;
        for(int i=0;i<len;i++){
            res = (res + dfs((U)^(1 << i), i)) % mod;
        }
        return res;
    }
};

 

 泰裤辣!!

1262.可被三整除的最大和 

 思路:贪心

由于数组中没有负数,如果整个数组的元素和 s 可以被 3 整除,那么 s 就是最大的元素和。

否则,如果 s 不能被 3 整除,那就看看能否让 s 减去某些 nums[i],使得 s 可以被 3 整除。

找到所有 nums[i]%3=1 的 nums[i],放到数组中;

(1)如果 s%3=1:
        a1 不为空,那么答案可能是 s−a1​[0]
        如果 a2中至少有两个数,那么答案可能是 s−a2​[0]−a2​[1] 

         这两种情况取最大值。
         如果没有这样的数,返回0。

(2)如果s%3=2:

        如果a2不为空,那么答案可能是s−a2[0];
        如果 中至少有两个数,那么答案可能是 s−a1​[0]−a1​[1];
        这两种情况取最大值。如果没有这样的数,返回 0。

 代码:

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        int SUM=accumulate(nums.begin(),nums.end(),0);
        if(SUM%3==0) return SUM;
        vector<int> a[3];
        for(int x:nums) a[x%3].push_back(x);
        sort(a[1].begin(),a[1].end());
        sort(a[2].begin(),a[2].end());
        if(SUM%3==2) swap(a[1],a[2]);
        int ans=a[1].size()?SUM-a[1][0]:0;
        if(a[2].size()>1) ans=max(ans,SUM-a[2][0]-a[2][1]);
        return ans;


    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust in Action笔记 第四章生命周期、所有权、借用

第四章用了一个行星通信的例子来阐述整个主题&#xff0c;主要角色有地面站&#xff08;Ground station&#xff09;、人造卫星&#xff08;CubeSat&#xff09;&#xff0c;两者有不同的状态并且能互相发消息通信&#xff1b; Rust有类型安全&#xff08;type safety&#xf…

WinDbg安装入坑1(C#)

由于作者水平有限&#xff0c;如有写得不对的地方&#xff0c;请指正。 使用WinDbg的过程中&#xff0c;坑特别的多&#xff0c;对版本要求比较严格&#xff0c;如&#xff1a; 1 32位应用程序导出的Dump文件要用32位的WinDbg打开&#xff0c;想要没有那么多的问题&#xff…

传统机器学习算法解析(opencv实现)

前言 文本主要解析在传统机器学习当中一些小的算法与思想&#xff0c;只是传统机器学习算法当中的一小部分&#xff0c;更多传统机器学习算法可参考我的另外几篇博客 链接1: PCA主成分分析 链接2: Canny边缘检测算法 链接3: K-Means聚类算法 链接4: SIFT算法分析 1. opencv …

农村饮水安全政策要求与解决措施

农村饮水安全&#xff0c;是指农村居民能够及时、方便地获得足量、洁净、负担得起的生活饮用水。农村饮水安全包括水质、水量、用水方便程度和供水保证率4项评价指标。 一、农村饮水安全问题 农村饮水安全问题一直是农村发展的重要问题。在过去&#xff0c;由于农村供水设施落…

Linux之多线程(下)——线程控制

文章目录 前言一、POSIX线程库1.概念2.pthread线程库是应用层的原生线程库3.错误的检查 二、线程控制1.创建线程——pthread_createpthread_create函数例子创建一个新线程主线程创建一批新线程 2.获取线程ID——pthread_self3.线程等待——pthread_join4.线程终止——return、p…

Flutter的状态管理之Provider

Provider简介 Flutter Provider是Flutter中一个非常流行的状态管理库&#xff0c;它可以帮助开发者更加方便地管理应用程序中的状态。Provider提供了一种简单的方式来共享和管理应用程序中的数据&#xff0c;并且可以根据数据的变化来自动更新UI界面。 Provider的核心思想是将…

C# 自动更新(基于FTP)

效果 启动软件后&#xff0c;会自动读取所有的 FTP 服务器文件&#xff0c;然后读取本地需要更新的目录&#xff0c;进行匹配&#xff0c;将 FTP 服务器的文件同步到本地 Winform 界面 一、前言 在去年&#xff0c;我写了一个 C# 版本的自动更新&#xff0c;这个是根据配置文…

qt学习——基本使用、对象树、按钮、信号与槽

初识qt **qt****qt命名规范以及相关快捷键的使用****QPushButton****对象树****点击按钮关闭窗口****信号和槽****标准的信号和槽****自定义信号和槽****带参数的自定义信号和槽传参以及函数的二义性问题****信号和槽的拓展****qt4的信号与槽****QDebug的输出转义问题****lambd…

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 Proteus仿真小实验&#xff1a; STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 LCD1602显示器HCSR04超声波传感器按键(加 减)电机蜂鸣器 1.单片机…

Qt编写视频监控系统76-Onvif跨网段组播搜索和单播搜索的实现

一、前言 在视频监控行业一般会用国际onvif工具来测试设备是否支持onvif协议&#xff0c;工具的名字叫ONVIF Device Manager&#xff08;还有个工具叫ONVIF Device Test Tool&#xff0c;专用于程序员测试各种数据交互&#xff09;&#xff0c;可以自行搜索下载&#xff0c;此…

04-编织灵魂旋律:Golang 函数的魔力绽放

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

通过共享内存进行通信(嵌入式学习)

通过共享内存进行通信 概念特点函数示例代码 概念 在Linux中&#xff0c;共享内存是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;允许多个进程共享同一块内存区域。这种通信方式可以提供高效的数据传输&#xff0c;特别适用于需要频繁交换数据的场景。 IO间进…

为CentOs配置静态IP

目录 第一步&#xff1a;查看物理机IP 第二步&#xff1a;虚拟机网络设置 点击虚拟机->编辑虚拟机设置 第三步&#xff1a;CentOS网络配置文件 第四步&#xff1a;重启网络 第五步&#xff1a;测试网络 为什么要设置静态IP 在安装好CentOS虚拟机以后&#xff0c;一般我…

程序替换原理

文章目录 一、程序替换 一、程序替换 程序替换用于将当前进程的用户空间的代码和数据全部替换为新程序的代码和数据&#xff0c;程序替换不会创建新进程&#xff0c;而是用当前进程执行新程序的代码&#xff0c;fork 创建子进程后&#xff0c;子进程默认执行的是父进程的代码&…

vue2和vue3的渲染过程简述版

文章目录 vue2渲染过程vue3渲染过程优化和扩充 vue2和vue3对比 vue2渲染过程 在Vue 2的渲染过程中&#xff0c;包括以下几个关键步骤&#xff1a; 解析模板&#xff1a;Vue 2使用基于HTML语法的模板&#xff0c;首先会将模板解析成抽象语法树&#xff08;AST&#xff09;&…

K8s 部署 Apache Kudu 集群

一、K8s 部署 Apache Kudu 集群 安装规划 组件replicaskudu-master3kudu-tserver3 1. 创建命名空间 vi kudu-ns.yamlapiVersion: v1 kind: Namespace metadata:name: apache-kudulabels:name: apache-kudukubectl apply -f kudu-ns.yaml查看命名空间&#xff1a; kubectl …

JUC高级-0614

5.LockSupport与线程中断 5.1 线程中断 蚂蚁金服面试题&#xff1a;如何中等一个线程&#xff0c;如何停止一个线程什么是中断机制 首先&#xff1a;一个线程不应该由其他线程来强制中断或停止&#xff0c;而是应该由线程自己自行停止。所以&#xff0c;Thread.stop, Thread.…

【spring源码系列-06】refresh中obtainFreshBeanFactory方法的执行流程

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

十个实用MySQL函数

函数 0. 显示当前时间 命令&#xff1a;。 作用: 显示当前时间。 应用场景: 创建时间&#xff0c;修改时间等默认值。 例子&#xff1a; 1. 字符长度 命令&#xff1a;。 作用: 显示指定字符长度。 应用场景: 查看字符长度时。 例子&#xff1a; 2. 日期格式化 命令…

面试---简历

项目 1.1、商品管理 新增商品 同时插入商品对应的使用时间数据&#xff0c;需要操作两张表&#xff1a;product&#xff0c;product_usetime。在productService接口中定义save方法&#xff0c;该方法接受一张Dto对象&#xff0c;dto对象继承自product类&#xff0c;并将prod…