【每日一题】2024年3月汇编(上)

news2024/10/7 8:31:51

3.1【2369】检查数组是否存在有效划分

2369. 检查数组是否存在有效划分icon-default.png?t=N7T8https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/

1.这样的判断可以用动态规划来解决,用一个长度为(n+1) 的数组来记录  是否存在有效划分,dp[i] 表示前 i 个元素组成的数组是否至少存在一个有效划分。边界情况 dp[0] 恒为 true而 dp[n] 即为结果。

动态规划的公式为:

这道题目是一个简单的dp,经历了上个月树的一整个月的dfs,bfs的洗礼,盲猜这个月都是dp。

class Solution {
public:
    bool validPartition(vector<int>& nums) {
         int n = nums.size();
        vector<int> dp(n + 1,0);
       
        dp[0] = true;
        for(int i = 1; i <= n; i++){
            if(i >= 2){
                dp[i] = dp[i - 2] && validTwo(nums[i - 1],nums[i - 2]);
            }
            if(i >= 3){
                dp[i] = dp[i] || dp[i -3] && validThree(nums[i -3], nums[i -2],nums[i - 1]);
            }
        }
        return dp[n];
    }
    bool validTwo(int num1,int num2){
        return num1 == num2;
    }
    bool validThree(int num1, int num2, int num3){
        return (num1 == num2 && num2 == num3) || (num1 + 1 == num2 && num2 + 1 == num3);
    }
};

3.2【2368】受限条件下可能达到的节点数目

2368. 受限条件下可到达节点的数目icon-default.png?t=N7T8https://leetcode.cn/problems/reachable-nodes-with-restrictions/

没想到今天的题目又回到了树的遍历问题,和上个月的一道题很像,是一个求邻接表然后进行dfs的题目

  1. 对于lamda表达式:捕获列表(Capture List)[&],这表示以引用的方式捕获外部变量。参数列表(Parameter List)(int x, int f),这是lambda函数接受的两个整数参数。返回类型:这里返回类型为 void,由于使用了 function<void(int,int)> 进行了明确的类型声明。

  2.  lamda表示式定义的第二个参数是为了,遍历的时候不往回找,一直往下找。
  3. 临近表的操作定义二维数组存储即可,做限制的函数一维数组置1即可。
class Solution {
public:
    int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {
        //邻接表
        vector<vector<int>> g(n);
        for(auto &v : edges){
            g[v[0]].push_back(v[1]);
            g[v[1]].push_back(v[0]);
        }
        //做限制
        vector<int> isrestricted(n);
        for(auto &x : restricted){
            isrestricted[x] = 1;
        }
        int cnt = 0; 
        function<void(int,int)> dfs = [&](int x,int f){
            cnt ++;
            for(auto &y : g[x]){
                 if(y != f && !isrestricted[y])
                 dfs(y,x);
            }
        };
        dfs(0,-1);
        return cnt;
    }
};

3.3【225】用队列实现栈

225. 用队列实现栈icon-default.png?t=N7T8https://leetcode.cn/problems/implement-stack-using-queues/

easy题目,熟悉队列基本操作,还有拓展准备一下一个队列的解法

 方法一:两个队列(O(1))

class MyStack {
public:
    queue<int> q1;
    queue<int> q2;

    MyStack() {
     
    }
    
    void push(int x) {
            q2.push(x);
            while(!q1.empty()){
                q2.push(q1.front());
                q1.pop();
            }
            swap(q1,q2);
    }
    
    int pop() {
          int r = q1.front();
          q1.pop();
          return r;
    }
    
    int top() {
    return(q1.front());
    }
    
    bool empty() {
          return(q1.empty());
    }
};

*方法二 一个队列(O(n))

queue<int> q1;
    MyStack() {
     
    }  
    void push(int x) {
        int n = q1.size();
       q1.push(x);
       for(int i = 0; i < n; i++){
           q1.push(q1.front());
           q1.pop();
       }
    

3.4【232】用栈实现队列

232. 用栈实现队列icon-default.png?t=N7T8https://leetcode.cn/problems/implement-queue-using-stacks/

较为简单,双栈实现队列的push,pop等工作

class MyQueue {
public:
    stack<int> instack,oustack;
    MyQueue() {

    }
    
    void push(int x) {
        instack.push(x);
    }
    
    int pop() {
        if(oustack.empty()){
        while(!instack.empty()){
            oustack.push(instack.top());
            instack.pop();
        }
        }
       int r =  oustack.top();
       oustack.pop();
       return r;
    }
    
    int peek() {
        if(oustack.empty()){
         while(!instack.empty()){
            oustack.push(instack.top());
            instack.pop();
        }
        }
        return oustack.top();
    }
    
    bool empty() {
       return(instack.empty() && oustack.empty());
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

3.6【2917】找出数组中的k-or值

2917. 找出数组中的 K-or 值icon-default.png?t=N7T8https://leetcode.cn/problems/find-the-k-or-of-an-array/

题目难以理解什么意思,主要是按照给的范围遍历位运算

由于给定了nums中元素的范围,我们位从1到31遍历,每一次循环右移i位与1按位与,就是最后一位和1与,记录数目。如果说大于给定的k,对于这个第i位,1向左移动i位和ans按位或 。

class Solution {
public:
    int findKOr(vector<int>& nums, int k) {
        int ans = 0;
 for(int i = 0; i < 31; i++)
{
    int cnt = 0;;
    for(int num: nums){
        if(num >> i & 1 ){
            cnt ++;
        }
    }
      if(cnt >= k){
          ans |=  1<<i;
      }
}    
return ans;
}
};

3.8【2834】找出美丽数组的最小和

2834. 找出美丽数组的最小和icon-default.png?t=N7T8https://leetcode.cn/problems/find-the-minimum-possible-sum-of-a-beautiful-array/

作一个贪心,卡住范围,整体思路就不难了

  1. 分析题目,按照贪心,要最小和,所以从1开始,按顺序递增的加,但是到二分之target就不能取了,然后就从target依次往后取。
  2.  根据等差数列求和公式就可以解决
  3. 注意int不行,要给个long long防止溢出
class Solution {
public:
    int minimumPossibleSum(int n, int target) {
        const int mod = 1e9 + 7;
        int m = target / 2;
        if(n <= m){
            return (long long)(1 + n) * n / 2 % mod;
         }
         else{
             return ((long long)(1 + m) * m /2 + ((long long)target + target + (n - m) - 1) * (n - m) /2) % mod;
         }
    }
};

3.10【299】猜数字游戏

299. 猜数字游戏icon-default.png?t=N7T8https://leetcode.cn/problems/bulls-and-cows/

今天的题目其实就是一个模拟,熟悉数组存储数据个数。

 先把猜对的对应上的数字记录下来,然后如果不对应,用两个数组全部对应,我一开始的思路是先把对应的记录下来,然后删除再去比其他的就要麻烦不少。

用两个数组记录其他的地方出现的数字的个数,最后再通过min,找出猜对了,但是位置不对的个数。

class Solution {
public:
    string getHint(string secret, string guess) {
        int bulls = 0;
        vector<int> cntS(10),cntG(10);
        for(int i = 0; i < secret.size(); i++){
            if(secret[i] == guess[i]) {
                bulls++;
            }
            else{
                ++cntG[secret[i] - '0'];
                ++cntS[guess[i] - '0'];
            }
        }

        int cows = 0;
        for(int i = 0; i < 10;i++){
            cows += min(cntS[i],cntG[i]);
        }
        return to_string(bulls) + 'A' + to_string(cows) + 'B';
    }
};

3.11【2129】将标题首字母大写

2129. 将标题首字母大写icon-default.png?t=N7T8https://leetcode.cn/problems/capitalize-the-title/

看题目知道是一个模拟题,大小写转换比较经典,如果用c++的话,一句话一句话的模拟会发现确实很麻烦,题解中用到一个l,一个r指向每一个单词的前后端,思路更为清晰

  1.  toupper,tolower大小写字母转换
  2. 整体思路,while大循环,tittle后边加个空格,防止结尾不同处理。先把r移动到单词的最右边 ,判断单词个数是否需要首字母置为大写,再所有的字母置为小写,最后把最后的空格删掉
class Solution {
public:
    string capitalizeTitle(string title) {
        int l = 0,r = 0;
        int n = title.size();
        title.push_back(' ');
        while(r < n){
            while(title[r] != ' '){r ++;}
            if(r - l > 2){
                title[l] = toupper(title[l]);
                ++l;
            }
            while(l < r){
                title[l] = tolower(title[l]);
                ++l;
            }
            l = r + 1;
            ++r;
        }
        title.pop_back();
        return title;
    }
};

3.12【1261】在受污染的二叉树中查找元素

1261. 在受污染的二叉树中查找元素icon-default.png?t=N7T8https://leetcode.cn/problems/find-elements-in-a-contaminated-binary-tree/

DFS+哈希表,还原二叉树以后,找target的个数是否大于0
  1.  用DFS还原二叉树,再判断个数,难度不大
class FindElements {
public:
    unordered_set<int> valSet;
    void dfs(TreeNode* node,int val){
        if(!node){
            return;
        }
        node -> val = val;
        valSet.insert(val);
        dfs(node -> left,val * 2 + 1);
        dfs(node -> right,val * 2 + 2);
    }

    FindElements(TreeNode* root) {
            dfs(root,0);
    }
    
    bool find(int target) {
       return valSet.count(target) > 0;
    }
};

3.13【2864】最大二进制奇数

2864. 最大二进制奇数icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-odd-binary-number/

复刷指数:0

简单题,直接模拟

class Solution {
public:
    string maximumOddBinaryNumber(string s) {
        int sum = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == '1'){
                sum++;
            }
        }
        string s1;
        
        for(int i = 0; i < sum - 1 ;i++){
            s1.push_back('1');
        }
        for(int i = 0; i < s.size() - sum; i++){
            s1.push_back('0');
        }
        s1.push_back('1');
        return s1;
    }
};

3.14【2789】合并后数组的最大元素

2789. 合并后数组中的最大元素icon-default.png?t=N7T8https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/

复刷指数:1

倒叙遍历+贪心。难度不大

  1. 我们从后往前倒序遍历一次数组,依次比较两个相邻的元素,如果两个相邻的元素能够合并,就将其合并。如果不能合并,就继续往前判断。因为这样的操作流程,在比较过程中,靠后的数是所有操作流程可能性中能产生的最大值,而靠前的数,是所有操作流程可能性中能产生的最小值。如果在遍历过程中,比较的结果是不能合并,那么其他任何操作流程都无法合并这两个数。如果可以合并,那我们就贪心地合并,因为这样能使接下来的比较中,靠后的数字尽可能大。

class Solution {
public:
    long long maxArrayValue(vector<int>& nums) {
        long long sum = nums.back();
        for(int i = nums.size() - 2; i >= 0; i--){
            sum = nums[i] <= sum ? nums[i] + sum : nums[i];
        }
        return sum;
    }
};

3.16【2684】矩阵中移动的最大次数

2684. 矩阵中移动的最大次数icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-number-of-moves-in-a-grid/

两轮遍历,注意限制索引

  1. 如果满足要求就让ans等于列数,如果不满足,就把这个地方设为最大值,后边都不会比他大了
  2.  从第一列开始遍历,因为和前面一列进行比较,这个方法主要是因为搜索过程只能前进不能后退
class Solution {
public:
    int maxMoves(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        int ans = 0;
        for(int i = 1; i < n; i++){//列
            for(int j = 0; j < m; j++){
                if(grid[j][i] > grid[j][i - 1] || j > 0 && grid[j][i] > grid[j-1][i -1] ||j + 1 < m && grid[j][i] > grid[j + 1][i -1]){//限制索引
                    ans = i;
                }
                else{
                    grid[j][i] = INT_MAX;
                }
            }
        }
        return ans;
    }
};

3.17【310】最小高度树

310. 最小高度树icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-height-trees/

复刷指数:5

很漂亮的一道题,难度已经是中等题的天花板,是一个从外向内部剥菜的思想,内嵌BFS

 

  1. 核心思想:最矮树的根一定不是入度为1的点(画图看下,很容易证明),把最矮树的叶子节点全部减掉,剩下的仍然是最矮树。所以对一个图,不断的把它的叶子节点减掉,减到最后剩下的就一定是最矮树的根。
  2. 普通思想就是BFS遍历每一个节点,统计每个节点的高度,用map存储起来,查询高度集合中最小的,但是会超时。我们从边缘开始,先找到所有出度为1的节点,然后把所有出度为1的节点进队列,然后不断地bfs,最后找到的就是两边同时向中间靠近的节点,那么这个中间节点就相当于把整个距离二分了,那么它当然就是到两边距离最小的点啦,也就是到其他叶子节点最近的节点了。
class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        vector<int> res;
        if(n == 1){
            res.push_back(0);
            return res;
        }
//      建立度的表
        vector<int> degree(n,0);
        vector<vector<int>> map (n,vector<int>());
        for(auto &edge : edges){
            degree[edge[0]]++;
            degree[edge[1]]++;
            map[edge[0]].push_back(edge[1]);
            map[edge[1]].push_back(edge[0]);
        }
//      建立队列,把度为1的点扔进去开始剥皮
        queue<int> q;
        for(int i = 0; i < n; i++){
            if(degree[i] == 1) {q.push(i);}
        }
        while(!q.empty()){
            res.clear();//我们每次要清空,这样最后就剩下最小高度树了
            int size = q.size();
            for(int i = 0; i < size; i++){
                int cur = q.front();
                q.pop();
                res.push_back(cur);//把所有当前节点加入结果集
                vector<int> neighbors = map[cur];//用一个数组接一下
                //经典BFS
                for(int neighbor : neighbors){
                    degree[neighbor] --;
                    if(degree[neighbor] == 1){
                        q.push(neighbor);
                    }
                }
            }
        }
        return res;
    }
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单页面应用部署到iis上可以正常打开,刷新就404

当您遇到Dumi打包的网站部署到IIS上可以正常打开首页,但刷新页面时出现404错误的情况,这通常与以下几个方面有关: 路由处理: Dumi生成的项目通常基于SPA(Single Page Application)架构,使用前端路由来实现无刷新导航。这意味着大部分页面切换是在浏览器层面完成的,而不…

循环神经网络(RNN):处理序列数据的利器

目录 1. 引言 2.RNN原理与时间步展开 3.LSTM与GRU工作机制与优势 3.1.LSTM&#xff08;Long Short-Term Memory&#xff09; 3.2.GRU&#xff08;Gated Recurrent Unit&#xff09; 4.应用案例 4.1文本生成 4.2情感分析 5.总结 1. 引言 循环神经网络&#xff08;Recurr…

el-select动态禁用

在一个el-form表单中有5个el-form-item; 每个el-form-item是一个el-select控件&#xff1b; 这5个el-select控件遵循这样的规则&#xff0c;都是使用同一个list集合&#xff0c;如果第一个el-select选择了list中的某一项&#xff0c;那么这一项就被禁用&#xff1b;其他的el-…

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考&#xff1a;【3D目标检测】环境搭建&#xff08;OpenP…

【Entity Framework】Code First 数据批注

【Entity Framework】Code First 数据批注 文章目录 【Entity Framework】Code First 数据批注一、概述二、模型二、键Key三、组合键四、外键-ForeigKey第一种&#xff1a;指定导航属性&#xff0c;会自动生成外键&#xff0c;命名规则为&#xff1a;“对象名称_主键名“第二种…

YOLOv9改进策略:注意力机制 | 二阶通道注意力机制(Second-order Channel Attention,SOCA),实现单图超分效果

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;CVPR_2019 SOCA注意力&#xff0c;一种基于二阶通道注意力机制&#xff0c;能够单幅图像超分辨率&#xff0c;从原理角度分析能够在小目标检测领域实现大幅涨点效果&#xff01;&#xff01;&#xff01; &am…

文件编辑命令—vim

1.vim vim 是vi的升级版本.vi 文件名(vi方向键用不了) vim 的官方网站 (welcome home : vim online) 自己也说 vim 是一个程序开发工具而不是文字处理软件。 2.安装vim sudo apt install vim 如果出错了:apt update:刷新软件源; 出现"无法获得锁 之类的"sudo rm 文件…

Vit Transformer

一 VitTransformer 介绍 vit : An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 论文是基于Attention Is All You Need&#xff0c;由于图像数据和词数据数据格式不一样&#xff0c;经典的transformer不能处理图像数据&#xff0c;在视觉领域的应…

【jenkins+cmake+svn管理c++项目】Windows环境安装以及工具配置

一、目标和环境 目标&#xff1a;搭建一个jenkins环境&#xff0c;实现jenkins调用cmake和svn和VS编译c项目&#xff0c;并将生成的库上传svn。 环境&#xff1a;win10虚拟机&#xff08;练习流程用&#xff0c;正式用的话还是放到服务器&#xff09;&#xff0c;VS2017. 二、…

肿瘤靶向肽 iRGD peptide环肽 1392278-76-0 c(CRGDKGPDC)

RGD环肽 c(CRGDKGPDC)&#xff0c;iRGD peptide 1392278-76-0 结 构 式&#xff1a; H2N-CRGDKGPDC-OH(Disulfide Bridge:C1-C9) H2N-Cys-Arg-Gly-Asp-Lys-Gly-Pro-Asp-Cys-COOH(Disulfide Bridge:Cys1-Cys9) 氨基酸个数&#xff1a; 9 C35H57N13O14S2 平均分子量:…

智能优化算法 | Matlab实现牛顿-拉夫逊优化算法Newton-Raphson-based optimize(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现牛顿-拉夫逊优化算法Newton-Raphson-based optimize(内含完整源码) 源码设计 % ------------------------------------------------------------------------------------------------…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

55、Qt/事件机制相关学习20240326

一、代码实现设置闹钟&#xff0c;到时间后语音提醒用户。示意图如下&#xff1a; 代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(t…

【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录 Redis 介绍 Redis 为什么这么快&#xff1f; Redis数据结构 Redis 和Memcache区别 &#xff1f; 为何Redis单线程效率也高&#xff1f; Redis 介绍 Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据…

【Linux】从零开始认识进程 — 中下篇

送给大家一句话&#xff1a; 人一切的痛苦&#xff0c;本质上都是对自己无能的愤怒。而自律&#xff0c;恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

1.6.1 变换

我们要想改变物体的位置&#xff0c;现有解决办法是&#xff0c;每一帧改变物体的顶点并且重配置缓冲区从而使物体移动&#xff0c;但是这样太繁琐&#xff0c;更好的解决方式是使用矩阵&#xff08;Matrix&#xff09;来更好的变换&#xff08;Transform&#xff09;一个物体。…

Python更改Word文档的页面大小

页面大小确定文档中每个页面的尺寸和布局。在某些情况下&#xff0c;您可能需要自定义页面大小以满足特定要求。在这种情况下&#xff0c;Python可以帮助您。通过利用Python&#xff0c;您可以自动化更改Word文档中页面大小的过程&#xff0c;节省时间和精力。本文将介绍如何使…

每日一题 --- 删除链表的倒数第 N 个结点[力扣][Go]

删除链表的倒数第 N 个结点 题目&#xff1a;19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#x…

Python中lambda函数使用方法

在Python中&#xff0c;lambda 关键字用于创建匿名函数&#xff08;无名函数&#xff09;&#xff0c;这些函数的特点是简洁、一次性使用&#xff0c;并且通常用于只需要一行表达式的简单场景。下面是lambda函数的基本结构和使用方法&#xff1a; 基本语法&#xff1a; lambd…

代码随想录算法训练营DAY7| C++哈希表Part.2|LeetCode:454.四数相加II、383.赎金信、15. 三数之和、18.四数之和

文章目录 454.四数相加II思路C代码 383.赎金信C 代码 15. 三数之和排序哈希法思路C代码 排序双指针法思路去重C代码 18.四数之和前言剪枝C代码 454.四数相加II 力扣题目链接 文章链接&#xff1a;454.四数相加II 视频链接&#xff1a;学透哈希表&#xff0c;map使用有技巧&…