首页 > 编程语言 >刷题笔记——顺序表(C++)

刷题笔记——顺序表(C++)

时间:2024-01-03 22:31:49浏览次数:32  
标签:nums int 元素 笔记 second vector C++ 数组 刷题

665. 非递减数列 - 力扣(LeetCode)

给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。

我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]

刷题笔记——顺序表(C++)_数据结构与算法

解题思路

遍历数组,计算递减对,显然当递减对>1时,不满足条件,当递减对=0时,满足条件。容易忽视的时当递减对=1时的情况:

刷题笔记——顺序表(C++)_学习笔记_02

刷题笔记——顺序表(C++)_数据结构与算法_03

代码实现

class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
        int count = 0;
        int temp = -1;
        for(int i = 0; i < nums.size()-1; i++){
            if(nums[i]>nums[i+1]){
                count++;
                temp = i;
            }
        }
        if(count>1){
            return false;
        }
        if(count==0){
            return true;
        }
        if(temp==0||nums[temp-1]<=nums[temp+1]){
            return true;
        }
        if(temp==nums.size()-2||nums[temp]<=nums[temp+2]){
            return true;
        }
        return false;
    }
};

2032. 至少在两个数组中出现的值 - 力扣(LeetCode)

给你三个整数数组 nums1nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。

刷题笔记——顺序表(C++)_数据结构与算法_04

解题思路

1° 统计每个元素的出现次数:定义哈希表,遍历每个数组,然后对出现的元素进行异或处理。

2° 筛选出出现次数≥2的元素:然后根据得到的异或结果再进行与运算。

3° 具体操作解析如下:

刷题笔记——顺序表(C++)_数据结构与算法_05

如果元素在2个或3个数组中出现过,那么它的与运算(v&(v-1))的二进制结果中仍有1存在(即结果不为0),将符合条件的该元素加进结果数组中即可。

代码实现

class Solution {
public:
    vector<int> twoOutOfThree(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3) {
        unordered_map<int, int> mp;
        for (auto& i : nums1) {
            mp[i] = 1;
        }
        for (auto& i : nums2) {
            mp[i] |= 2;
        }
        for (auto& i : nums3) {
            mp[i] |= 4;
        }
        vector<int> res;
        for (auto& [k, v] : mp) {
            if (v & (v - 1)) {
                res.push_back(k);
            }
        }
        return res;
    }
};

2170. 使数组变成交替数组的最少操作数 - 力扣(LeetCode)

给你一个下标从 0 开始的数组 nums ,该数组由 n 个正整数组成。

如果满足下述条件,则数组 nums 是一个 交替数组 :

  • nums[i - 2] == nums[i] ,其中 2 <= i <= n - 1 。
  • nums[i - 1] != nums[i] ,其中 1 <= i <= n - 1 。

在一步 操作 中,你可以选择下标 i 并将 nums[i] 更改 为 任一 正整数。

返回使数组变成交替数组的 最少操作数 。

刷题笔记——顺序表(C++)_数据结构与算法_06

解题思路

声明两个哈希表,分别存储数组中奇数位和偶数位的元素的出现次数。

①先处理一般情况,当奇数位和偶数位出现次数最多的元素不相同的时候,显然只需保留这两种元素,对其他值进行修改即可。

②当奇数位和偶数位出现次数最多的元素相同时,我们只能选择“奇数位出现次数最多的元素+偶数位出现次数第二多的元素”,“偶数位出现次数最多的元素+奇数位出现次数第二多的元素”中较大的一个,然后对剩余的数进行修改。

理清了思路,现在来看具体操作:

1° 遍历数组,更新哈希表的值(也就是统计奇偶数位各数的出现次数)

2° 定义若干变量记录奇偶位出现次数最多和第二多的键和键值。通过遍历奇偶哈希表获得所需要的值。

3° 添加判断条件,即②中的步骤。最后返回即可。

代码实现

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        unordered_map<int, int> odd;
        unordered_map<int, int> even;
        for(int i = 0; i < nums.size(); i++){
            if(i % 2 == 0){
                even[nums[i]]++;
            } else {
                odd[nums[i]]++;
            }
        }
        
        int oddMax = 0;
        int oddSecondMax = 0;
        int evenMax = 0;
        int evenSecondMax = 0;
        int oddMaxKey = 0;
        int evenMaxKey = 0;
        
        for(auto it = odd.begin(); it != odd.end(); it++){
            if(it->second >= oddMax){
                oddSecondMax = oddMax;
                oddMax = it->second;
                oddMaxKey = it->first;
            } else if(it->second > oddSecondMax){
                oddSecondMax = it->second;
            }
        }
        
        for(auto it = even.begin(); it != even.end(); it++){
            if(it->second >= evenMax){
                evenSecondMax = evenMax;
                evenMax = it->second;
                evenMaxKey = it->first;
            } else if(it->second > evenSecondMax){
                evenSecondMax = it->second;
            }
        }
        if(oddMaxKey!=evenMaxKey){
            return nums.size()-oddMax-evenMax;
        }
        return nums.size()- max(oddMax + evenSecondMax, evenMax + oddSecondMax);
    }
};

标签:nums,int,元素,笔记,second,vector,C++,数组,刷题
From: https://blog.51cto.com/goku0623/9089747

相关文章

  • C++汇总路径下全部文件名并提取出指定类型或名称的文件
      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。  首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我们如果想获取其中所有类型为.bmp格式的文件的名称,如果文件数量比较多的话,手动筛选就会很麻烦。而借......
  • openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理
    openGauss学习笔记-185openGauss数据库运维-升级-提交升级/升级版本回退/异常处理185.1提交升级升级完成后,如果验证也没问题。接下来就可以提交升级。说明:一旦提交操作完成,则不能再执行回滚操作。操作步骤以数据库用户(如omm)登录节点。执行如下命令完成升级提交。......
  • C++11中的匿名函数用法
    C++11中引用了匿名函数这一个新的特性,它的使用方法如下:[capture](parameters)->return_type{body} 其中:capture 指定了Lambda表达式可以访问的外部变量parameters 是Lambda表达式的参数列表return_type 是返回类型(可选)body 是Lambda函数体下面是一个简单......
  • oracle 9i&10g编程艺术-读书笔记1
    根据书中提供的下载代码链接地址,从github上找到源代码下载地址。https://github.com/apress下载好代码后,开始一段新的旅行。......
  • openGauss学习笔记-183 openGauss 数据库运维-升级-升级操作
    openGauss学习笔记-183openGauss数据库运维-升级-升级操作介绍就地升级、灰度升级和滚动升级的详细操作。183.1就地升级和灰度升级操作步骤以root身份登录节点。创建新包目录。mkdir-p/opt/software/gaussdb_upgrade将需要更新的新包上传至目录“/opt/software/g......
  • openGauss学习笔记-184 openGauss 数据库运维-升级-升级验证
    openGauss学习笔记-184openGauss数据库运维-升级-升级验证本章介绍升级完成后的验证操作。给出验证的用例和详细操作步骤。184.1验证项目的检查表表1验证项目的检查表序号验证项目检查标准检查结果1版本查询查询升级后版本是否正确-2健康检查使用gs_ch......
  • Flutter学习笔记(一)配置环境
    主题本文主题,就是介绍如何配置flutter当前环境win10as2022.1.1版本jdk11配置过程下载fluttersdk首先,从官网下载一个flutter的sdk,下载地址博主当前使用版本为–flutter_windows_3.7.8-stable配置fluttersdk环境(1)下载sdk后,解压,进入bin目录,复制完整路径,打开系统环境变量页面,在Path栏......
  • 【C++】STL 容器 - set 集合容器 ⑥ ( pair 对组简介 | pair 对组元素访问 | set 集合
    文章目录一、pair对组1、pair对组简介2、pair对组元素访问3、代码示例-pair对组4、set集合容器存储pair对组元素二、set集合容器insert插入结果类型-pair对组1、std::set#insert函数原型分析2、代码示例-std::set#insert函数插入元素结果分析一、pair对组1......
  • 【C++】STL 容器 - set 集合容器 ⑤ ( 仿函数 functor 简介 | 仿函数 functor 调用 |
    文章目录一、仿函数functor1、仿函数functor简介2、仿函数functor调用3、代码示例-仿函数functor调用二、为自定义类元素设置排序规则-仿函数functor1、自定义类排序规则2、仿函数-实现自定义类排序规则3、重载<运算符函数-实现自定义类排序规则一、仿函数fu......
  • 【C++】STL 容器 - set 集合容器 ④ ( 设置 set 集合容器的排序规则 | 默认的 set 集
    文章目录一、设置set集合容器的排序规则1、默认的set集合容器-从小到大排列2、设置set集合容器从大到小排列二、使用仿函数自定义set集合容器排序规则1、仿函数概念2、使用仿函数实现set集合容器排序规则一、设置set集合容器的排序规则1、默认的set集合容器-......