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

C++刷题(四):vector

📝前言说明:
本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C++。
每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的讲解,主要是个人见解,如有不正确,欢迎指正,一起进步!

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C++学习笔记,C语言入门基础,python入门基础,python刷题专栏
🎀CSDN主页 愚润泽


题目

  • 118. 杨辉三角
  • 260. 只出现一次的数 |||
  • 137. 只出现一次的数 ||
  • 26. 删除重复项
  • 超过一半的数字

118. 杨辉三角

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> c(numRows); // 创建numRows行
        for(int i = 0; i < numRows; i++)
        {
            c[i].resize(i + 1, 1); // 将每一行初始化
            for(int j = 1; j < i; j++)
            {
                c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
            }
        }
        return c;
    }
};

260. 只出现一次的数 |||

在这里插入图片描述
解题思路:
在这里插入图片描述
回忆一下异或:

  • 一个数异或0得到它本身
  • (不溢出的前提下)一个数异或它的相反数可以得到最低位的1(且唯一),因为负数的补码是:从右边数,找到第一个1以后,左边的数全部按位取反
class Solution {
public:
    vector<int> singleNumber(vector<int> &nums) {
        unsigned int x_all = 0; // 这个必须是无符号的
        // 如果是有符号的,如:-128 的相反数 128 表示不了,会溢出,导致出错
        for(auto x: nums)
        {
            x_all ^= x;
        }
        int lowbit = x_all & (- x_all);
        vector<int> ans(2);
        for(auto x: nums)
        {
            // 由 x & lowbit 来分组
            ans[(x & lowbit) != 0] ^= x;
        }
        return ans;
    }
};

137. 只出现一次的数 ||

在这里插入图片描述
在这里插入图片描述
注意:

  • int是32为比特位的,4个字节,每个字节8个比特位
  • num >> 1就是将num的二进制右移1为,不会改变num的值
  • 二进制数&1可以得到最低位的数
  • 将一个只有第i位为1的二进制数a与另一个二进制数b按位或,可以将b的第i改成1
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for(int i = 0; i < 32; i++)
        {
            int cnt = 0;
            for(auto num: nums)
            {
                cnt += (num >> i) & 1; // 对所有数字的当前位进行求和 (从低位到高位)
            }
            ans |= ((cnt % 3) << i); // 将本位的结果复制到ans上,即按位或 | 
        }
        return ans;
    }
};

26. 删除重复项

在这里插入图片描述
没什么好说的,注意原地修改。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int k = 1;
        for(int i = 1; i < nums.size(); i++)
        {
            if(nums[i] != nums[i-1])
            {
                nums[k] = nums[i];
                k++;
            }
        }
        return k;
    }
};

超过一半的数字

在这里插入图片描述
候选法:
加入数组中存在众数,那么众数一定大于数组的长度的一半。
思想就是:如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。

具体做法:

  1. 初始化:候选人cond = -1, 候选人的投票次数cnt = 0 遍历数组,如果cnt=0
  2. 表示没有候选人,则选取当前数为候选人,++cnt
  3. 否则,如果cnt > 0,表示有候选人,如果当前数=cond,则++cnt,否则--cnt
  4. 直到数组遍历完毕,最后检查cond是否为众数
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        int cond = -1;
        int cnt = 0;
        for(int i = 0; i < numbers.size(); i ++)
        {
            if(cnt == 0)
            {
                cond = numbers[i];
                cnt++;
            }
            else{
                if(cond == numbers[i])
                    cnt++;
                else
                 cnt--;
            }
        }
        return cond;
    }
};

因为这题保证数组非空且有解,不然还要再遍历一次,判断cond是否个数>size()/2


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

  • 没有数据湖?可观测性也许不再有效!
  • 透视飞鹤2024财报:如何打赢奶粉罐里的科技战?
  • deepseek对IBM MQ错误日志分析
  • java项目挂机自动重启操作指南
  • STM32八股【5】----- TIM定时器
  • 堆叠虚拟化2
  • 界面自适应new 使用postcss-pxtorem
  • FreeRTOS 知识点总结(二):同步机制与应用场景
  • 如何在JMeter中配置断言,将非200状态码视为测试成功
  • java 洛谷题单【数据结构1-4】图的基本应用
  • 15:00开始面试,15:08就出来了,问的问题有点变态。。。
  • 射频功率放大器保护电路简略
  • 消息中间件对比与选型指南:Kafka、ActiveMQ、RabbitMQ与RocketMQ
  • Oracle数据库数据编程SQL<3.6 PL/SQL 包(Package)>
  • 25.4.1学习总结【Java】
  • 嵌入式EMC设计面试题及参考答案
  • 汇编学习之《移位指令》
  • Citus源码(2)分布式读流程分析与基础概念梳理(shardid、placementid、groupid)
  • 【QT】QT的多界面跳转以及界面之间传递参数
  • 【超详细】一文解决更新小米澎湃2.0后LSPose失效问题
  • 俄媒:俄乌代表团抵达谈判会场
  • 烤肉店从泔水桶内捞出肉串再烤?西安未央区市监局:停业整顿
  • 泽连斯基与埃尔多安会面,称已决定派遣代表团前往伊斯坦布尔
  • 经济日报评外卖平台被约谈:行业竞争不能背离服务本质
  • 万科再获深铁集团借款,今年已累计获股东借款近120亿元
  • “80后”北京市东城区副区长王智勇获公示拟任区委常委