leetcode刷题(5): STL的使用

news2024/11/17 19:40:55

文章目录

    • 56. 合并区间
      • 解题思路
      • c++实现
    • 55. 跳跃游戏
      • 解题思路
      • c++ 实现
    • 75. 颜色分类
      • 解题思路
      • c++ 实现
    • 36 下一个排列
      • 解题思路
      • c++ 实现

56. 合并区间

题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例:
在这里插入图片描述

解题思路

  • 首先利用sort对区间起点排序
    在这里插入图片描述

  • 每次取连续的区间查看是否相交,若相加合并。若无相交,由于按照起点排序,后面区间的起点更大,也就不可能再有相交的可能。
    在这里插入图片描述

c++实现

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.size() <2) return intervals;

        sort(intervals.begin(),intervals.end());

        vector<int> tmp = intervals[0];

        vector<vector<int>> ans;

        for(int i=1;i<intervals.size();i++)
        {
            if (tmp[1]>=intervals[i][0])
            {
                // 合并区间
                tmp[0] = min(tmp[0],intervals[i][0]);
                tmp[1] = max(tmp[1],intervals[i][1]);

                //  ans.push_back(tmp);  //注意不要写这句
            }
            else
            {
                // 区间不相交,则将tmp放入答案
                // 然后tmp 等于当前元素
                ans.push_back(tmp);
                tmp = intervals[i];
            }
        }
        
        // 记得把最后一个区间放入答案
        ans.push_back(tmp);

        return ans;
    }
};
  • 对比连续的两个区间,如果重叠则合并两个区间
  • 如果区间不相交,则将前一个区间tmp加入答案中, 并更新tmp区间为当前元素
  • 记得把最后一个区间放入答案

55. 跳跃游戏

题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃最大长度

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

示例:
在这里插入图片描述

解题思路

  • 每次跳跃可到达的最远距离canreach,可用如下公式表示:
int currPos =0;  // 假设当前位置为0
int canreach = currPos + nums[curPos];
  • 第一次跳跃达到最远距离为canreach, 接着从第二个格子到canreach范围内跳跃,每次跳跃更新canreach的值,保存最大的canreach。
  • 如果最大的canreach超出(≥)格子范围,则返回true, 否则返回false

参考: https://www.cnblogs.com/itdef/p/16675994.html

c++ 实现

class Solution {
public:
    bool canJump(vector<int>& nums) {
        
        int curPos =0;
        int canreach = curPos + nums[curPos];

        for(;curPos<canreach;curPos++)
        {
            if (curPos>=nums.size()-1)  return true;
            canreach = max(canreach,curPos + nums[curPos]);
        }

        if (canreach >= nums.size()-1) return true;

        return false;

    }
};

75. 颜色分类

题目: 给定一个包含红色白色蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数0、 1 和 2分别表示红色、白色和蓝色

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例:
在这里插入图片描述

  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

解题思路

  • 使用整数0、 1 和 2分别表示红色、白色和蓝色, 也就是给我们一个由0,1,2数字组成的数组,需要我们对其原地进行排序
  • 最基本最朴素的想法是使用如下sort 排序,很明显题目要求不能使用库函数sort来排序, 它的时间复杂度为nlog(n), 但题目要求一趟扫描算,也就是实现O(n)时间复杂度:
sort(nums.begin(),nums.end());
  • 对题目分析可知,不管怎样排序,最终的结果都是: 所有为0元素排在数组最左边,所有为2元素排在数组最右边,剩下所有1排数组的中间
  • 可以设置两个边界:left和right。 边界left的左边全部为0,边界right右边为2, left 和right中间部分全为1
    在这里插入图片描述
  • 可以通过两次扫描第一次扫描,将全部0元素放在数组最左边,第二次扫描将所有1元素紧接着0元素放置,剩下的位置就是元素2

c++ 实现

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int l=0,r=0;
        //(1) 将所有0元素 移动到数组最左边
        for(r=0;r<nums.size();r++)
        {
            if (nums[r] ==0)
            {
                swap(nums[r],nums[l]);
                l++;
            }
        }
		
		//(2) 将所有1元素,移动到所有0元素之后
		//  此时剩余的最右边的元素只有2了
        for(r=0;r<nums.size();r++)
        {
            if (nums[r] ==1)
            {
                swap(nums[r],nums[l]);
                l++;
            }
        }

        return ;
        
    }
};
  • 使用swap函数来调换元素,这样才能保证变换后素组中的元素是不变的,只是顺序变换了,切记不能使用=后来调换,这样不光改变顺序,同时会改变nums数组中的元素值,比如,如下错误写法:
  for(r=0;r<nums.size();r++)
   {
        if (nums[r] ==0)
        {
           nums[l++] = nums[r]}
    }
  for(r=0;r<nums.size();r++)
  {
        if (nums[r] ==1)
        {
           nums[l++] = nums[r]}
    }
  • 实现步骤(1) 将所有0元素 移动到数组最左边, 使用swap来调换顺序
  • 实现步骤(2) 将所有1元素,移动到所有0元素之后,使用swap来调换顺序

36 下一个排列

题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须 原地 修改,只允许使用额外常数空间。

示例:
在这里插入图片描述

解题思路

下一个排序,简而言之,就是找到一个最接近的一个比它大的数。通过观察规律可以发现:

  • 右向左找到第一个不符合升序的数字, 然后与从右向左找到第一个比它大的数字进行交换
  • 比如1234 找到第一个不符合升序的数字3,3比4小,再从右向左找一个比它大的数字4进行交换,变成1243即可。
  • 经过交换后数字比原来的数字排列大但未必是最接近的最小值,因为交换后右边数字是降序排列的,需要调整为升序排列,这样才能保证得到的是一个最接近它,比原来排列数字大的。
  • 例如 13 4 2 找到第一个不符合升序数字3,再找到交换的数字4,变换为 14 3 2, 这时候 3比2要大,还需要对4右边的数字,升序排列,1 4 2 3才是正解

c++ 实现

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i=0;
        for (i= nums.size()-2;i>=0;i--)
        {   //(1) 逆序查找,找到第一个不符合的(从右往左)升序数字
            if(nums[i]<nums[i+1])
            {
                //(2) 再逆序查找,第一个比刚才的数字大的数字,进行交换
                for(int j=nums.size()-1;j>i;j--)
                {
                    if (nums[j]>nums[i])
                    {
                        swap(nums[i],nums[j]);
                        //reverse(nums.begin()+i+1,nums.end());
                        //(3) 交换完之后,将两交换数字右边的数字升序排列
                        sort(nums.begin()+i+1,nums.end());
                        return;
                        
                    }
                }
            }
        }

        if (i<0)
        {
            reverse(nums.begin(),nums.end());
            return;
        }
    }
};
  • (1) 逆序查找,找到第一个不符合的(从右往左)升序数字
  • (2) 再逆序查找,第一个比刚才的数字大的数字,进行交换(注意不是前后两个数字交换), 比如:[1,3,2] ->[2,3,1]->[2,1,3]
  • (3) 交换完之后,将两交换数字右边的数字升序排列
    • 此时找到了最接近的比它大的数字,记得马上就return; 否则还会继续交换,得不到正确的结果
  • (4) 如果逆序遍历完,都没有发现不符合的升序数字,说明该数字排列本身就是最大的,此时根据题目要求需要返回最小的排列,使用reverse函数就可以实现。

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

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

相关文章

仓库管理系统需求调研要点

仓库管理系统需求调研 一、仓库的作用 仓库分类 原材料仓库&#xff1a;用于存放生产所需的原材料和零部件&#xff0c;需要保持原材料的质量和数量稳定。半成品仓库&#xff1a;存放生产过程中的半成品和在制品&#xff0c;需要保持良好的生产流程和及时出库。成品仓库&#x…

tabby多个窗口同时执行插件

一、插件名称 安装插件quick-cmds 二、使用 点击右上角图标&#xff0c;选中命令单机即可。快捷键ALTQ唤出列表&#xff0c;不用每次用鼠标点击右上角&#xff0c;巴适的板。 ctrl enter发送全部

EditReady for Mac激活版:专业视频转码工具

对于视频专业人员来说&#xff0c;一款高效的视频转码工具是不可或缺的。EditReady for Mac正是这样一款强大的工具&#xff0c;它拥有简洁直观的操作界面和强大的功能&#xff0c;让您的视频处理工作事半功倍。 EditReady for Mac支持多种视频格式的转码&#xff0c;并且支持常…

旺店通·企业奇门和金蝶云星空单据接口对接

旺店通企业奇门和金蝶云星空单据接口对接 源系统:金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造面向…

【解决】Android Studio Toast点击不显示

问题描述 开发Android程序过程中&#xff0c;突然发现在Android studio的模拟机上&#xff0c;运行测试程序&#xff0c;Toast弹框不能使用了&#xff0c;但是解决方法非常粗暴和直接&#xff1a;重新加载一个新的虚拟机或清空当前虚拟机的数据&#xff0c;然后再重启。 明显&a…

如何把多个文件(夹)向上移动1层(或多层)(在批量复制前或后进行)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 假定情况是&#xff0c;我要把下图里的4个文件夹内部的全部文件&#xff0c;合并到04的当前位置来&#xff08;4个文件夹里面各有5个兔兔的图片&#xff09…

【教学类-53-01】20240509“去掉背景的png彩色图片”转“黑色影子图”

作品展示 背景需求&#xff1a; 刚写完蒙德里安涂色学具&#xff0c;准备开课&#xff0c;转眼班级就“百日咳“”隔离3周&#xff0c;o(╥﹏╥)o 我的AI对话大师只剩1个月的有效期&#xff0c;剩下9万6千次也马上就作废了。 最后一个月可以尽量多用掉一些&#xff0c;我从小…

JVM的垃圾回收

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机:是指通过软件模拟的具有完整硬件功能、运行在一个完全隔离的环境中完整计算机系统 1.JVM的内存区域划分 jvm是一个java进程 每一个java进程就是一个jvm实例 一个进程运行过程中 就要从操作系…

使用C++ __builtin_expect优化程序性能后,程序体积不改变原因

结论 使用__builtin_expect优化程序性能&#xff0c;开启-O3的情况下&#xff0c;确实程序的体积可能不改变&#xff0c;但是还是会产生优化效果。 测试代码 不使用__builtin_expect #include <iostream>void fun(int a, int b) {// 不使用__builtin_expectif (a <…

前端面试题 | 常考题整理

本文为面试中出现的高频次考题&#xff0c;具体还是要看所有题。 目录 css 1、☆介绍下 BFC 及其应用 3、☆浮动清除 17、☆说几个未知宽高元素水平垂直居中方法 js 9、☆箭头函数与普通函数的区别是什么&#xff1f;构造函数可以使用 new 生成实例&#xff0c;那么箭头…

Hass哈斯数控数据采集网络IP配置设置

机床数据采集&#xff08;MDC&#xff09;允许你使用Q和E命令通过网络接口或选项无线网络从控制系统提取数据。设置143支持该功能&#xff0c;并且指定控制器使用这个数据端口。MDC是一个需要一台附加计算机发送请求&#xff0c;解释说明和存储机床数据的软件功能。这个远程计算…

【Vue】结合ElementUI实现简单数据请求和页面跳转功能

一、准备工作 1、创建一个Vue-cli程序 之前的博客有。各位看官姥爷&#xff0c;可以自查。 2、安装ElementUI 在创建Vue-cli程序的过程中&#xff0c;需要在控制台执行以下指令&#xff1a; #安装 element-ui npm i element-ui -S #安装 SASS 加载器 cnpm install sass-loa…

SD卡和TF卡

SD卡和TF的电信号区别在于 SD比TF多一个地线。 请注意假如TVS结电容过高会导致无法通信&#xff0c;对于高速的通信同样如此&#xff0c;需要控制好ESD的结电容。 SD卡线需要注意50ohm阻抗要求 https://blog.csdn.net/jiangfutao/article/details/124466153 SD卡&#xff1a; …

解析ProxySQL的故障转移机制

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解析ProxySQL的故障转移机制 前言故障检测故障切换策略故障转移流程 前言 在数据库的世界里&#xff0c;故障就像是一颗定时炸弹&#xff0c;随时可能引发系统崩溃。而ProxySQL&#xff0c;就像是这场…

组织机构树形列表实现

先看下效果图&#xff1a; 主要是用xm-select.js组件做的一个树形列表 xm-select.js的说明文档&#xff1a;https://maplemei.gitee.io/xm-select/?select1#/basic/disabled 实现步骤&#xff1a; HTML部分 <!DOCTYPE html> <html lang"en"> <hea…

【Linux系统编程】第十五弹---调试器gdb使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、背景 2、安装gdb 3、gdb的使用 总结 1、背景 前面我们学习了文件编辑器&#xff0c;项目自动化构建工具&#xff0c;以及g…

mybatis-plus代码

项目结构 config package com.example.mpdemo.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept…

1756jsp农产品销售管理系统Myeclipse开发mysql数据库C2C模式java编程计算机网页项目沙箱支付

一、源码特点 java 农产品销售管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…

Linux文本处理工具【tr、cut、sort、uniq】

1. tr 命令——替换、压缩、删除 tr (Text Replacer) 命令常用来对来自标准输入的字符进行替换、压缩和删除。 命令格式 &#xff1a;tr [选项]... SET1 [SET2] &#xff08;SET 是一组字符串&#xff0c;一般都可按照字面含义理解&#xff09; 选项&#xff1a; -d 删除 -s 压…

vue地址选择器-三级联选择器+详细地址

在页面的显示情况 前端拼接实现存储 具体实现步骤 1.安装中国全省市区的数据 在命令提示符窗口使用管理员身份进入对应vue项目的文件夹&#xff0c;在窗口安装 npm install element-china-area-data -S2.在script内引入安装的数据 import {regionData,codeToText } from…