Leetcode 4.1

LeetCode 热题 100

  • 贪心算法
    • 1.买卖股票的最佳时机
    • 2.跳跃游戏
    • 3.跳跃游戏 II
    • 4.划分字母区间
  • 区间合并
    • 1.合并区间

贪心算法

1.买卖股票的最佳时机

买卖股票的最佳时机
买的那天一定是卖的那天之前的最小值。 每到一天,维护那天之前的最小值即可。
在题目中,我们只要用
一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的。
那么我们在第 i 天卖出股票能得到的利润就是 prices[i] - minprice,更新利润最大值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int min_prices = INT_MAX;
        int ans = 0;
        for (auto &p: prices) {
            min_prices = min(min_prices, p);
            ans = max(ans, p - min_prices);
        }
        return ans;
    }
};

2.跳跃游戏

跳跃游戏
我们依次遍历数组中的每一个位置,并实时维护最远可以到达的位置。对于当前遍历到的位置 x,如果它在最远可以到达的位置的范围内,那么我们就可以从起点通过若干次跳跃到达该位置,因此我们可以用 x+nums[x] 更新最远可以到达的位置。

在遍历的过程中,如果最远可以到达的位置大于等于数组中的最后一个位置,那就说明最后一个位置可达,我们就可以直接返回 True 作为答案。反之,如果在遍历结束后,最后一个位置仍然不可达,我们就返回 False 作为答案。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        //最远能到达距离,最开始为0
        int rightmost = 0;
        for (int i = 0; i < n; i++) {
            //当前位置在最远能到达距离内
            if (i <= rightmost) {
                //更新最远能到达举例,i + nums[i]是当前位置能到的最远距离
                rightmost = max(rightmost, i + nums[i]);
                //如果说能到最后一个元素的位置则为true
                if (rightmost >= n - 1) {
                    return true;
                }
            }
        }
        return false;
    }
};

3.跳跃游戏 II

跳跃游戏 II
与上题相比,我们需要增加一个变量end,记录上一次跳跃能到的最远边界,比如下图,从下标0出发,我们第一跳能够到达的最远位置为下标2,跳跃次数+1,下标1下标2记录最远能够到达的下标就是max(1+3, 2+1) = 4。也就是说我们两跳最远能到达下标4。
我们维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加1
在遍历数组时,我们不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了。如果访问最后一个元素,在边界正好为最后一个位置的情况下,我们会增加一次「不必要的跳跃次数」,因此我们不必访问最后一个元素。
可以这么理解 想象你在玩大富翁,回合制游戏,随身带的钱决定你每回合最多可以走多少格,需要以最短的回合数到达终点。 格子里面的数字代表“钱”,每回合你需要停留在格子里休息得到补充的“钱”才能继续行走。 每次走到一个格子的时候,你需要估计预算在下一个回合能走多少格,哪个格子的钱最多,下一回合就去那个格子 。但是前面的格子里有多少钱有战争迷雾看不到,要到了才知道。 end指本回合能走的最远位置,即钱用完了就不能继续往前了,rightmost就是钱。
在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums) {
        //能跳到的最远位置
        int rightmost = 0;
        //跳跃次数
        int lessjump = 0;
        //上次跳跃可达最远右边界
        int end = 0;
        for (int i = 0; i < nums.size() - 1; i++) {
            if (i <= rightmost) {
                rightmost = max(rightmost, i + nums[i]);
                //到上次跳跃能到的最远右边界了
                if (i == end) {
                	//这次跳跃能到的最远右边界
                    end = rightmost;
                    //跳跃次数+1
                    lessjump++;
                }
            }
        }
        return lessjump;       
    }
};

4.划分字母区间

划分字母区间
想切割,要有首尾两个指针,确定了结尾指针,就能确定下一个切割的开始指针。
遍历字符串,如果已扫描部分的所有字符,都只出现在已扫描的范围内,即可做切割。
下图已扫描的绿色字符,对应的最远位置,都不超过 8,在 8 这切一刀,[0:8]的字符都不会出现在别处。
在这里插入图片描述
这道题相当于前两道跳跃题,遍历字符串,记录当前能跳到的最远距离。

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> ans;
        unordered_map<char, int> mp;
        //记录当前字母出现的最远距离
        for (int i = 0; i < s.length(); i++) {
            mp[s[i]] = i;
        }

        int right = 0, left = 0;
        for (int i = 0; i < s.length(); i++) {
            //更新跳跃的最远距离
            right = max(right, mp[s[i]]);
            //跳到最远距离了
            if (i == right) {
            	//记录长度
                ans.push_back(right - left + 1);
                //从下一个元素重新开始
                left = i + 1;
            }
        }
        return ans;
    }
};

区间合并

1.合并区间

56. 合并区间
这道题就是比较当前vector.back()[1]和下一个vector, [0]的大小,如果有重叠则更新vector.back()[1]。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        //先按左端点排序
        sort(intervals.begin(), intervals.end());
        for (int i = 0; i < intervals.size(); i++) {
        	//记录当前区间的L、R值
            int L = intervals[i][0], R = intervals[i][1];
            //如果是第一个区间,或者说相邻区间没有重叠
            if (res.empty() || res.back()[1] < L) {
            	//添加当前区间
                res.push_back({L, R});
            } else {
            	//否则更新区间的右端点
                res.back()[1] = max(res.back()[1], R);
            }
        }
        return res;
    }
};

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

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

相关文章

LAN和WAN, 调制解调器, 路由器,交换机 区别

LAN LAN&#xff08;Local Area Network&#xff09;是指在相对较小的地理范围内&#xff08;如办公室、学校、实验室、家庭等&#xff09;连接在一起的计算机和网络设备的集合。LAN通常由路由器、交换机、网线、无线路由器等设备组成&#xff0c;用于连接多台计算机、打印机、…

实验四 Spark Streaming编程初级实践

一、Flume简介 数据流 &#xff1a;数据流通常被视为一个随时间延续而无限增长的动态数据集合&#xff0c;是一组顺序、大量、快速、连续到达的数据序列。通过对流数据处理&#xff0c;可以进行卫星云图监测、股市走向分析、网络攻击判断、传感器实时信号分析。 二、Flume安装…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化&#xff1a; 2.数据库设计与规划 1.提前估计数据量&#xff0c;使用什么存储引擎 2.数据库服务器专机专用&#xff0c;避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器&#xff0c;以达到稳定、高效的效果。主从同步、…

C++ 2024-4-1 作业

#include <iostream> using namespace std;class A { public:int a;A(int a):a(a){cout<<"A的有参构造"<<endl;} }; class B:virtual public A { public:int b;B(int a,int b):A(a),b(b){cout<<"B的有参构造"<<endl;} }; cl…

vscode通过ssh连接服务器(吐血总结)

一、通过ssh连接服务器 1、打开vscode&#xff0c;进入拓展&#xff08;CtrlShiftX&#xff09;&#xff0c;下载拓展Remote - SSH。 2、点击远程资源管理器选项卡&#xff0c;选择远程&#xff08;隧道/SSH&#xff09;类别。 3、点击SSH配置。 4、在中间上部分弹出的配置文件…

Mac反编译APK

文章目录 第一种方式: brew installapktool 使用说明dex2jar 使用说明 第二种方式: 下载安装包apktool 使用说明 (根据官方介绍没有操作成功,后续成功再更新这里)dex2jar 使用说明 安装 JD-GUI 查看jar包中的class文件JD-GUI 使用说明 第一种方式: brew install 安装过程可能很…

Excel 隔几行批量插入空白行

例如如下表格&#xff0c;每隔6行插入一行数据&#xff1a; 1&#xff09;第7个单元格输入1 2&#xff09;选中6个单元格&#xff0c;然后双击填充数据&#xff1a; 3&#xff09;F5 找到常量 Ctrlshift 复制插入的数据&#xff0c;然后选中数据 按F5&#xff0c;定位到空值

第21章-直连路由和静态路由

1. 直连路由 1&#xff09;定义&#xff1a;指路由器接口直接相连的网段的路由&#xff1b; 2&#xff09;特点&#xff1a; ① 不需要特别的配置&#xff0c;双UP(物理层数据链路层)&#xff1b; ② 在路由器的接口上配置IP地址即可&#xff1b; ③ 开机自动产生&#xff1b; …

如何做用户体验优化

本文是从用户体验优化角度谈用户体验&#xff0c;其实用户体验不是设计必须的步骤&#xff0c;而是分散在产品设计中的产品设计思想。 一、用户体验分类 用户体验是指用户在“使用”某个产品或服务过程中的全部感受&#xff0c;包括情感、信仰、喜好、认知印象、生理和心理反应…

789. 数的范围 (二分学习)

1.确定一个区间&#xff0c;使得目标值一定在区间中 2.找一个性质满足&#xff1a; &#xff08;1&#xff09;性质具有二段性 &#xff08;2&#xff09;答案是二段性的分界点 3.整数二分&#xff08;处理红色右端点和绿色左端点&#xff09; //代码1&#xff1a;右端点 int…

探讨在大数据体系中API的通信机制与工作原理

** 引言 关联阅读博客文章&#xff1a;深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章&#xff1a;深入理解HDFS工作原理&#xff1a;大数据存储和容错性机制解析 ** 在当今数字化时代&#xff0c;数据已经成为企业发展和决策的核心。随着数据规模的不断增长…

网络安全 | 什么是网络安全?

关注WX&#xff1a;CodingTechWork 网络安全 网络安全-介绍 网络安全是指用于防止网络攻击或减轻其影响的任何技术、措施或做法。网络安全旨在保护个人和组织的系统、应用程序、计算设备、敏感数据和金融资产&#xff0c;使其免受简单而不堪其绕的计算机病毒、复杂而代价高昂…

人工智能之深度学习笔记——每天五分钟快速掌握深度学习理论

本专栏会对深度学习以及深度学习搭建技巧做一个详尽的介绍&#xff0c;相信大家阅读完本专栏之后&#xff0c;深度学习已经不是一个遥不可及的名词&#xff0c;我们会知道它究竟是什么&#xff0c;本专栏尽可能地简单详细地介绍每一个深度学习知识&#xff0c;帮助每天只用很少…

vue3中播放flv流视频,以及组件封装超全

实现以上功能的播放&#xff0c;只需要传入一个流的地址即可&#xff0c;当然组件也只有简单的实时播放功能 下面直接上组件 里面的flvjs通过npm i flv.js直接下载 <template><div class"player" style"position: relative;"><p style&…

什么是EDM邮件推广营销?

电子邮件作为最古老的互联网沟通工具之一&#xff0c;凭借其无可比拟的直达性、个性化潜力与高投资回报率&#xff0c;始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用&#xff0c;云衔科技以其前瞻视野与深厚技术底蕴&#xff0c;倾力打造了一站式智能EDM邮件营…

Excel·VBA二维数组组合函数之穷举推理题

看到一个帖子《CSDN-求助一道推理题》&#xff0c;与之前《python穷举暴力破解《2018年刑侦推理题》用python穷举的推理题很类似 那么是否可以使用《ExcelVBA二维数组组合函数、组合求和》combin_arr2d函数&#xff0c;生成结果进行穷举呢&#xff1f; Sub 穷举推理题()Dim …

搜维尔科技:Manus Prime 3 Mocap数据手套,体验极致的每指触觉!

完全适用于VR虚拟现实场景 特斯拉也在使用的量子数据 Tesla 目前正在使用 MANUS Quantum Metagloves创建一个数据集&#xff0c;帮助他们训练 Tesla 机器人。 量子数据训练QUANTUM AI 我们以类似的方式使用 Quantum Metagloves 来生成一流的手指跟踪数据集&#xff0c;并将其…

吴恩达2022机器学习专项课程(一) 4.5 线性回归的梯度下降

问题预览/关键词 本节内容梯度下降公式梯度下降公式的推导过程梯度下降在线性回归误差平方成本函数的收敛梯度下降在多曲面的收敛 笔记 1.本节内容 给线性回归模型的误差平方成本函数执行梯度下降。 2.梯度下降公式 线性回归下误差成本函数的梯度下降公式。 3.梯度下降公…

uniapp 小程序和app map地图上显示多个酷炫动态的标点,头像后端传过来,真机测试有效

展示效果 二、引入地图 如果需要搜索需要去腾讯地图官网上看文档&#xff0c;找到对应的内容 1.申请开发者密钥&#xff08;key&#xff09;&#xff1a;申请密钥 2.开通webserviceAPI服务&#xff1a;控制台 ->应用管理 -> 我的应用 ->添加key-> 勾选WebService…

OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

介绍 此Demo展示如何在ArkTS中调用相机拍照和录像&#xff0c;以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力ohos.abilityAccessCtrl 相机模块能力接口ohos.multimedia.camera 图片处理接口ohos.multimedia.image 音视频相关媒体业…