LeetCode 101题集(随时更新)

题集来源:GitHub - changgyhub/leetcode_101: LeetCode 101:力扣刷题指南

使用C++完成相关题目,以训练笔试


贪心

采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。

分配问题

455. 分发饼干 - 力扣(LeetCode)

题解:分别对孩子和饼干排序,从小到大尽可能多的满足孩子

class Solution 
{
public:
    int findContentChildren(vector<int>& g, vector<int>& s) 
    {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int child = 0, cookie = 0;
        while(child < g.size() && cookie < s.size())
        {
            if(g[child] <= s[cookie])   child ++;
            cookie ++;
        }
        return child;
    }
};

135. 分发糖果 - 力扣(LeetCode)

题解:先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。

class Solution 
{
public:
    int candy(vector<int>& ratings) 
    {
        int size = ratings.size();
        if(size < 2)    
            return size;

        vector<int> num(size, 1);

        for(int i = 1; i < size; i ++)
            if(ratings[i] > ratings[i - 1])
                num[i] = num[i - 1] + 1;

        for(int i = size - 1; i > 0; i --)
            if(ratings[i] < ratings[i - 1])
                num[i - 1] = max(num[i - 1], num[i] + 1);
                
        return accumulate(num.begin(), num.end(), 0);
    }
};

区间问题

435. 无重叠区间 - 力扣(LeetCode)

题解:先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。

class Solution 
{
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) 
    {
        if(intervals.empty())
            return 0;

        int n = intervals.size();
        sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b)
        {
            return a[1] < b[1];
        });

        int removed = 0, prev = intervals[0][1];

        for(int i = 1; i < n; i ++)
        {
            if(intervals[i][0] < prev)
                removed ++;
            else
                prev = intervals[i][1];
        }
        
        return removed;
    }
};

练习 

605. 种花问题 - 力扣(LeetCode)

题解:花不能种植在相邻的地块上!!!

class Solution 
{
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) 
    {
        int count = 0, size = flowerbed.size();

        for(int i = 0; i < size; i ++)
            if((i == 0 || flowerbed[i-1] == 0) && //0号坑or前一坑没种
                flowerbed[i] == 0 && //当前坑没种
                (i == size-1 || flowerbed[i+1] == 0))//最后一个坑or下一个坑没种
            {
                count ++;//在当前坑种花
                flowerbed[i] = 1;
            }
        
        return count >= n;
    }
};

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

题解:类435,单位判断条件不同

class Solution 
{
public:
    int findMinArrowShots(vector<vector<int>>& points) 
    {
        if(points.empty())
            return 0;

        int n = points.size();
        sort(points.begin(), points.end(), [](vector<int>& a, vector<int>& b)
        {
            return a[1] < b[1];
        });

        int arrows = 1, prev = points[0][1];

        for(int i = 1; i < n; i ++)
            if(points[i][0] > prev)
            {
                arrows ++;
                prev = points[i][1];
            }

        return arrows;
    }
};

763. 划分字母区间 - 力扣(LeetCode)

题解:第一次遍历确定每个字母的最后出现的下标,第二次遍历实时更新每个片段的最后下标

class Solution 
{
public:
    vector<int> partitionLabels(string s) 
    {
        int last[26];

        for(int i = 0; i < s.size();i ++)
            last[s[i] - 'a'] = i;

        vector<int> ans;
        int l = 0, r = 0;

        for(int i = 0; i < s.size(); i ++)
        {
            r = max(r, last[s[i] - 'a']);
            if(i == r)
            {
                ans.push_back(r - l + 1);
                l = i + 1;
            }
        }
            
        return ans;
    }
};

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

题解:每天保证至少不亏钱

class Solution 
{
public:
    int maxProfit(vector<int>& prices) 
    {
        int ans = 0;

        for(int i = 1; i < prices.size(); i ++)
            ans += max(0, prices[i] - prices[i-1]);

        return ans;
    }
};

406. 根据身高重建队列 - 力扣(LeetCode)

题解:先按身高从高往低排,再按前边比自身高的人数依次插入队列即可

class Solution 
{
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) 
    {
        sort(people.begin(), people.end(), [](vector<int>& a, vector<int>& b)
        {
            return a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]);
        });

        vector<vector<int>> ans;
        for(auto person : people)
            ans.insert(ans.begin() + person[1], person);

        return ans;
    }
};

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

题解:不仅要确保不小于上一位,还好比较上上一位,以确定整体非递减

class Solution 
{
public:
    bool checkPossibility(vector<int>& nums) 
    {
        int count = 0, n = nums.size();

        for(int i = 1; i < n; i ++)
            if(nums[i] < nums[i-1])
            {
                if(i == 1 || nums[i] >= nums[i-2])
                    nums[i-1] = nums[i];
                else
                    nums[i] = nums[i-1];
                count ++;
            }
        
        return count <= 1;
    }
};

双指针

两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。

两数之和

167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

题解:双指针分别从左往右,从右往左遍历数组

class Solution 
{
public:
    vector<int> twoSum(vector<int>& numbers, int target) 
    {
        int l = 0, r = numbers.size()-1, sum = 0;

        while(l < r)
        {
            sum = numbers[l] + numbers[r];
            if(sum == target)   break;
            if(sum < target)    l ++;
            else    r --;
        }
        
        return vector<int>{l + 1, r + 1};
    }
};

归并数组

88. 合并两个有序数组 - 力扣(LeetCode) 

题解:倒序将两数组归并在第一个数组,避免开辟额外空间

++ 和 -- 的小技巧: a++ 和 ++a 都是将 a 加 1,但是 a++ 返回值为 a,而++a 返回值为 a+1。如果只是希望增加 a 的值,而不需要返回值,则推荐使用 ++a,其运行速度会略快一些。

class Solution 
{
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) 
    {
        int k = m-- + n-- - 1;

        while(m >= 0 && n >= 0)
            nums1[k -- ] = nums1[m] > nums2[n] ? nums1[m --] : nums2[n --];
            
        while(n >= 0)
            nums1[k --] = nums2[n --];    
    }
};

快慢指针

142. 环形链表 II - 力扣(LeetCode)

题解

Floyd 判圈法:给定两个指针,分别命名为 slow 和 fast,起始位置在链表的开头。每次 fast 前进两步, slow 前进一步。如果 fast可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路,且一定存在一个时刻 slow 和 fast 相遇。当 slow 和 fast 第一次相遇时,我们将 fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。

class Solution 
{
public:
    ListNode *detectCycle(ListNode *head) 
    {
        ListNode* slow = head;
        ListNode* fast = head;
        while (true) 
        {
            if (fast == nullptr || fast->next == nullptr) return nullptr;
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow) break;
        }
        fast = head;
        while(slow != fast)
        {
            slow = slow -> next;
            fast = fast -> next;
        }
        return fast;
    }
};

滑动窗口 

 76. 最小覆盖子串 - 力扣(LeetCode)

题解:先统计字符串情况,再根据字符串情况滑动窗口

class Solution
{
public:
    string minWindow(string s, string t)
    {
        //先统计字符情况
        int baseHash[128] = { 0 }, curHash[128] = { 0 };
        for(auto& ch : t)
        {
            ++baseHash[ch];
        }

        int k = 0, minLen = s.size() + 1;//k:记录窗口起始位置 minLen:记录最小窗口长度
        int l = 0, r = 0, count = 0;

        //外层循环:窗口扩张
        while(r < s.size())
        {
            char i = s[r++];
            if(++curHash[i] <= baseHash[i])
            {
                ++count;
            }

            //内层循环:窗口收缩
            while(count == t.size())
            {
                if(r-l < minLen)
                {
                    k = l;
                    minLen = r-l;
                }

                char o = s[l++];
                if(curHash[o]-- <= baseHash[o])
                {
                    --count;
                }
            }
        }
        return minLen > s.size() ? "" : s.substr(k, minLen);
    }
};

练习

633. 平方数之和 - 力扣(LeetCode)

题解:类167,将c开根后与0进行平方和并判断大小

class Solution 
{
public:
    bool judgeSquareSum(int c) 
    {
        long l = 0;
        long r = (long)sqrt(c);

        while(l <= r)
        {
            long sum = l*l + r*r;
            if(sum == c)    return true;
            else if(sum > c)    r --;
            else    l ++;
        }

        return false;
    }
};

680. 验证回文串 II - 力扣(LeetCode)

题解:类167,双指针循环判断

class Solution 
{
private:
    bool isPalindrome(string& s, int left, int right) 
    {
        for(;left < right; ++left, --right)
            if (s[left] != s[right]) 
                return false;

        return true;
    }

public:
    bool validPalindrome(string s) 
    {
        for(int l = 0, r = s.size()-1; l < r; ++l, --r)
            if(s[l] != s[r])
                return isPalindrome(s, l+1, r) || isPalindrome(s, l, r-1);

        return true;
    }
};

 524. 通过删除字母匹配到字典里最长单词 - 力扣(LeetCode)

题解:排序 + 贪心 + 双指针

class Solution 
{
public:
    string findLongestWord(string s, vector<string>& dictionary) 
    {
        sort(dictionary.begin(), dictionary.end(), [](string& a, string& b)
        {
            return a.size() == b.size() ? a < b : a.size() > b.size();
        });

        int n = s.size();
        for(auto& ss : dictionary)
        {
            int m = ss.size();

            if(m > n)   continue;

            int i = 0, j = 0;
            while(i < n && j < m)
            {
                if(s[i] == ss[j])   
                    j ++;
                i++;
            }
            if(j == m)  
                return ss;
        }
        return "";
    }
};

340. 至多包含 K 个不同字符的最长子串 - 力扣(LeetCode) 

题解:类76

class Solution 
{
public:
    int lengthOfLongestSubstringKDistinct(string s, int k) 
    {
        if (s.size() == 0 || k == 0)
            return 0;

        int l = 0, r = 0, count = 0;
        int char_set[256] = {0};
        int ans = 0;

        //外层循环:窗口扩张
        while (r < s.size()) 
        {
            if (char_set[s[r]] == 0)
                count++;

            char_set[s[r ++]]++;

            //内层循环:窗口收缩
            while (count > k)
            {
                char_set[s[l]]--;
                if (char_set[s[l ++]] == 0)
                    count--;
            }

            ans = max(ans, r - l);
        }
        return ans;
    }
};

二分(后续更新)

排序

搜索

dp

分治

数学问题

位运算

STL

字符串

指针一:链表

指针二:树

指针三:图

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

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

相关文章

渗透测试笔记——shodan(4)

声明&#xff1a; 学习视频来自B站up主 【泷羽sec】有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&am…

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…

【Android】android compat理解

1&#xff0c;前提 即便是在同一手机上安装的不同apk&#xff0c;其编译的apk不同&#xff0c;也会导致行为上的差异。如SDK34有限制后台启动&#xff0c;但如果安装的apk所依赖的sdk是33&#xff0c;则不会表现出此差异。这是如何实现的呢&#xff1f;其实&#xff0c;本质是…

蓝桥杯每日真题 - 第21天

题目&#xff1a;(空间) 题目描述&#xff08;12届 C&C B组A题&#xff09; 解题思路&#xff1a; 转换单位&#xff1a; 内存总大小为 256MB&#xff0c;换算为字节&#xff1a; 25610241024268,435,456字节 计算每个整数占用空间&#xff1a; 每个 32 位整数占用…

MongoDB进阶篇-索引(索引概述、索引的类型、索引相关操作、索引的使用)

文章目录 1. 索引概述2. 索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引2.3.1 地理空间索引&#xff08;Geospatial Index&#xff09;2.3.2 文本索引&#xff08;Text Indexes&#xff09;2.3.3 哈希索引&#xff08;Hashed Indexes&#xff09; 3. 索引相关操作3.1 查看索…

做一个FabricJS.cc的中文文档网站——面向markdown编程

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;用爱发电&#…

自动驾驶之激光雷达

这里写目录标题 1 什么是激光雷达2 激光雷达的关键参数3 激光雷达种类4 自动驾驶感知传感器5 激光雷达感知框架5.1 pointcloud_preprocess5.2 pointcloud_map_based_roi5.3 pointcloud_ground_detection5.4 lidar_detection5.5 lidar_detection_filter5.6 lidar_tracking 1 什么…

Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪

这里写目录标题 1.目标检测 Detection2.实例分割 segment3.图像分类 classify4.关键点估计 Keypoint detection5.视频帧检测 video detect6.视频帧分类 video classify7.旋转目标检测 obb detect8.替换yolo11模型 给我点个赞吧&#xff0c;谢谢了附录coco80类名称 笔记本 华为m…

Laravel对接SLS日志服务

Laravel对接SLS日志服务&#xff08;写入和读取&#xff09; 1、下载阿里云的sdk #通过composer下载 composer require alibabacloud/aliyun-log-php-sdk#对应的git仓库 https://github.com/aliyun/aliyun-log-php-sdk2、创建sdk请求的service <?phpnamespace App\Ser…

uniapp接入高德地图

下面代码兼容安卓APP和H5 高德地图官网&#xff1a;我的应用 | 高德控制台 &#xff0c;绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…

初识WGCLOUD - 监测磁盘空间还能使用多久

WGCLOUD是一款免费开源的运维监控软件&#xff0c;性能优秀&#xff0c;部署简单&#xff0c;轻巧使用&#xff0c;支持大部分的Linux和Windows、安卓、MacOS等平台安装部署 最近发布的新版本 v3.5.4&#xff0c;WGCLOUD新增了可以自动计算每个磁盘剩余空间的可使用天数&#x…

【Xbim+C#】创建圆盘扫掠IfcSweptDiskSolid

基础回顾 https://blog.csdn.net/liqian_ken/article/details/143867404 https://blog.csdn.net/liqian_ken/article/details/114851319 效果图 代码示例 在前文基础上&#xff0c;增加一个工具方法&#xff1a; public static IfcProductDefinitionShape CreateDiskSolidSha…

数据结构 ——— 堆排序算法的实现

目录 前言 向下调整算法&#xff08;默认建大堆&#xff09; 堆排序算法的实现&#xff08;默认升序&#xff09; 前言 在之前几章学习了如何用向上调整算法和向下调整算法对数组进行建大/小堆数据结构 ——— 向上/向下调整算法将数组调整为升/降序_对数组进行降序排序代码…

图像预处理之图像滤波

目录 图像滤波概览 均值滤波&#xff08;Mean Filter&#xff09; 中值滤波&#xff08;Median Filter&#xff09; 高斯滤波&#xff08;Gaussian Filter&#xff09; 双边滤波&#xff08;Bilateral Filter&#xff09; 方框滤波&#xff08;Box Filter&#xff09; S…

Qt-多元素控件

Qt中的多元素控件 Qt提供的多元素控件有&#xff1a; 这里的多元素控件都是两两一对的。 xxWidget和xxView的一个比较简单的理解就是&#xff1a; xxView是更底层的实现&#xff0c; xxWidget是基于xxView封装来的。 可以说&#xff0c;xxView使用起来比较麻烦&#xff0c;但…

<Sqlite><websocket>使用Sqlite与websocket,实现网页端对数据库的【读写增删】操作

前言 本文是在websocket进行通讯的基础,添加数据库进行数据的存储,数据库软件使用的是sqlite。 环境配置 系统:windows 平台:visual studio code 语言:javascript、html 库:nodejs、sqlite 概述 此前,我们实现在利用websocket和socket,将网页端与下位控制器如PLC进行…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

主IP地址与从IP地址:深入解析与应用探讨

在互联网的浩瀚世界中&#xff0c;每台联网设备都需要一个独特的身份标识——IP地址。随着网络技术的不断发展&#xff0c;IP地址的角色日益重要&#xff0c;而“主IP地址”与“从IP地址”的概念也逐渐进入人们的视野。这两个术语虽然看似简单&#xff0c;实则蕴含着丰富的网络…

【Linux】文件IO的系统接口 | 文件标识符

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 最近真的任务拉满了&…

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…