【基础算法训练】—— 01背包 + 排序

本文记录了五道C++编程题的解题思路和代码,涉及有序数组的平方、丢失的数字、最大数对和的最小值、递增顺序显示卡牌以及01背包问题。介绍了排序、异或运算和动态规划在解题中的应用,同时探讨了算法的空间优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在这里插入图片描述
零零散散的有几个专栏专栏,只是都没有成气候,我这儿了,可能蓝桥专栏,反响最好,只是受限制于自己的算法能力十分薄弱,就更得特别慢,也不全面吧,蓝桥现在是我的心头痛,我想暂时放一放,我自己也还在学,再次更那个专栏,可能有新的突破吧。千锤百炼,静待花开。


现在的单片机是会持续更的,因为我要靠它去捣腾暑假实习的事儿:十四天学会51单片机
Leetcode的专栏会持续更,因为在跟着英雄哥做知识星球的事儿:在lc被欺负的这些年
对英雄哥的知识星球有兴趣的可以看看他这篇文章喔: 英雄算法联盟 | 31天让你的算法与众不同

至于现在这专栏了,是我4月12号的想法,只是因为四月我整体比较痛苦,一直没有动工,现在开始动工啦~,迟到一个月。这个专栏只会记录全部是每日一题:知识星球每天的习题,以及在咱高校算法学习社区中,泡泡和p佬普及组和提高组的题目,一般是当天写次天更吧。

倘若对算法学习比较迷茫的小伙伴,可以考虑假如咱高校算法学习社区呀~

社区地址:高校算法学习社区


社区暂时有每日一题普及组以及提高组,由现役Acmer每日出题带领刷题,不会可群里随时提问喔。只是咱们拒绝划水党以及潜水党,需要的加入可私信执梗,也可以私信我哈。

第一题 977. 有序数组的平方

💒题目描述

在这里插入图片描述
原题传送门

🌟解题报告

对于C++选手来说了,这个题应该不恼火,因为STL中提供了sort这个按照升序排序的函数,sort的时间复杂度是nlog2^n(log的底数选择默认的2)。题目的数据范围是10000,是不完全不会超时的。

🌻参考代码(C++版本)

class Solution {
   
public:
    vector<int> sortedSquares(vector<int>& nums) {
   
        //常规的sort就是递增吧
        vector<int> ans;
        
        for(auto n : nums)
            ans.push_back(n*n);
        
        sort(ans.begin(),ans.end());
        return ans;
    }
};

在这里插入图片描述

第二题 268. 丢失的数字

浅记录异或

💒题目描述

在这里插入图片描述
原题传送门

🌟解题报告

老老实实模拟的情况咱就不说了,C++的sort比C确实省了很多事儿。 看到一种用异或运算符来实现的玩法,浅记录一下。

异或是一个可交换顺序的操作。同一个数字异或两遍等于零。
在这里插入图片描述

也是先处理特殊情况吧。倘若最大的数字小于数组的长度,那么确实的数字是当前最大的数字+1;
处理完特殊情况,就进入咱们的异或环节了。
咱们在求最大值的时候可以顺带将数组的每个元素都异或一次,然后对0 ~ n中每个元素也异或一次,最后剩下的数字就是没有出现的数字了,因为其他都出现了两次。
比如样例中的[3,0,1]

🌻参考代码(C++版本)

解法一:老老实实模拟
class Solution {
   
public:
    int missingNumber(vector<int>& nums) {
   
        //从样例来分析了,是两种情况
        int len = nums.size();
        sort(nums.begin(),nums.end());
        int maxv = nums[len-1];
        int ans = 0;
        if(maxv != len) ans = len;
        
        for(int i = 1; i < len;i++)
            if(nums[i]-nums[i-1] != 1)
            {
   
                ans = nums[i]-1;
                break;
            }

        return ans;
    }
};
解法二:异或运算
class Solution {
   
public:
    int missingNumber(vector<int>& nums) {
   
        int n =0;
        int ans = 0;

        for(auto num:nums)
        {
   
            n = max(n,num);
            ans 
评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值