第二课 前缀和、差分、双指针扫描

news2024/12/22 20:26:44

文章目录

  • 第二课 前缀和、差分、双指针扫描
    • lc1.两数之和--简单
      • 题目描述
      • 代码展示
    • lc11.盛最多水的容器--中等
      • 题目描述
      • 代码展示
    • lc15.三数之和--中等
      • 题目描述
      • 代码展示
    • lc42.接雨水--困难
      • 题目描述
      • 代码展示
    • lc53.最大子数组和--中等
      • 题目描述
      • 代码展示

第二课 前缀和、差分、双指针扫描

lc1.两数之和–简单

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

代码展示

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        // pair<value, index>
        vector<pair<int,int>> nums;
        for (int i = 0; i < numbers.size(); i++) {
            nums.push_back(make_pair(numbers[i], i));
        }
        sort(nums.begin(),nums.end());
        int j = nums.size() - 1;
        for (int i = 0; i < nums.size(); i++) {
            while (i < j && nums[i].first + nums[j].first > target) j--;
            if (i < j && nums[i].first + nums[j].first == target) {
                return {nums[i].second, nums[j].second};
            }
        }
        return {};
    }
};

lc11.盛最多水的容器–中等

题目描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

示例 1:

img

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

代码展示

class Solution {
public:
    int maxArea(vector<int>& height) { 
/*
i<j
for i = 0 ~ n - 1
    for j = i + 1 ~ n - 1
        ans = max(ans, i,j盛水)
*/
        int i = 0, j = height.size() - 1;
        int ans = 0;
        while (i < j) {
            ans = max(ans, min(height[i], height[j]) * (j - i));
            if (height[i] == height[j]) i++, j--;
            else if (height[i] < height[j]) i++; else j--; 
        }
        return ans;
    }
};

lc15.三数之和–中等

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

代码展示

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        // nums[i] + nums[j] + nums[k] = 0
        // nums[j] + nums[k] = -nums[i]
        // i < j < k
        vector<vector<int>> ans;
        for (int i = 0; i < nums.size(); i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            auto all_two_sums = twoSum(nums, i + 1, -nums[i]);
            for (auto jk : all_two_sums) {
                ans.push_back({nums[i], jk[0], jk[1]});
            }
        }
        return ans;
    }

private:
    vector<vector<int>> twoSum(vector<int>& numbers, int start, int target) {
        vector<vector<int>> ans;
        int j = numbers.size() - 1;
        for (int i = start; i < numbers.size(); i++) {
            if (i > start && numbers[i] == numbers[i - 1]) continue;
            while (i < j && numbers[i] + numbers[j] > target) j--;
            if (i < j && numbers[i] + numbers[j] == target) {
                ans.push_back({numbers[i], numbers[j]});
            }
        }
        return ans;
    }
};

lc42.接雨水–困难

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

img

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

代码展示

class Solution {
public:    //单调栈的做法
    int trap(vector<int>& height) {
        int ans = 0;
        stack<Rect> s;
        s.push({0, 0});
        for (int h : height) {
            int w = 0;
            while (s.size() > 1 && s.top().height <= h) {
                w += s.top().width;
                int bottom = s.top().height;
                s.pop();
                ans += w * max(0, min(s.top().height, h) - bottom);
            }
            s.push({h, w + 1});
        }
        return ans;
    }

private:
    struct Rect {
        int height;
        int width;
    };
};
class Solution {
public:    //前后缀最大值的做法
    int trap(vector<int>& height) {
        int n = height.size();
        pre[0] = suf[n + 1] = 0;
        for (int i = 1; i <= n; i++) pre[i] = max(pre[i - 1], height[i - 1]);
        for (int i = n; i; i--) suf[i] = max(suf[i + 1], height[i - 1]);
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            ans += max(0, min(pre[i - 1], suf[i + 1]) - height[i - 1]);
        }
        return ans;
    }

private:
    int pre[100005];
    int suf[100005];
};

lc53.最大子数组和–中等

题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

代码展示

class Solution {
public:    //前缀和的做法
    int maxSubArray(vector<int>& nums) {
        // nums: 0~n-1
        // sum: 0,1~n
        int n = nums.size();
        vector<long long> sum(n + 1, 0);
        for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + nums[i - 1];
        vector<long long> pre(n + 1, 0);
        // 前缀最小值(前i个数的最小值)
        pre[0] = sum[0];
        for (int i = 1; i <= n; i++) pre[i] = min(pre[i - 1], sum[i]);

        long long ans = -1e10;
        // long long prefix_min = sum[0];
        // int_max = 2147483647 = 2^31-1 = 2e9
        for (int i = 1; i <= n; i++) {
            // i之前的j --> j<=i-1
            ans = max(ans, sum[i] - pre[i-1]);
            // prefix_min = min(prefix_min, sum[i]);
        }
        return ans;
    }
};
class Solution {
public:    //贪心的做法
    int maxSubArray(vector<int>& nums) {
        int sum = 0;
        int ans = -2e9;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
            ans = max(ans, sum);
            if (sum < 0) sum = 0;
        }
        return ans;
    }
};

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

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

相关文章

基于goravel的CMS,企业官网通用golang后台管理系统

2023年9月11日10:47:00 仓库地址&#xff1a; https://gitee.com/open-php/zx-goravel-website 框架介绍 Goravel SCUI 后端开发组件 go 1.20 Goravel 1.13 数据库 sql(使用最新日期文件) goravel\doc\sql_bak mysql 8.0 前端开发组件 scui 1.6.9 node v14.21.3 效果图…

凉鞋的 Unity 笔记 106. 第二轮循环场景视图Sprite Renderer

106. 第二轮循环&场景视图&Sprite Renderer 从这一篇开始&#xff0c;我们开始进行第二轮循环。 这次我们至少能够在游戏运行窗口看到一些东西。 首先还是在场景层次窗口进行编辑&#xff0c;先创建一个 Sprite&#xff0c;操作如下: 创建后&#xff0c;会在 Scene …

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥&#xff1a;mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex&#xff1a;直接进行lock()或者unlock()递归互斥锁recursive_mutex&#xff1a;可以多次加锁&#xff0c;意味着加几次锁就需要解几次锁…

华为MateBook13 2021款(WRTD-WFE9)原装出厂Win10系统工厂模式安装包(含F10智能还原)

下载链接&#xff1a;https://pan.baidu.com/s/1yL7jFbklrln0UqWqxQ7fcw?pwd9nm1 系统自带一键智能还原功能、带有指纹、声卡、显卡、网卡等所有驱动、出厂主题壁纸、系统属性华为专属LOGO标志、Office办公软件、华为电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U…

公众号留言插件有哪些?有哪些好用的小程序?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

全能视频工具 VideoProc Converter 4K for mac中文

VideoProc 4K提供快速完备的4K影片处理方案&#xff0c;您可以透过这款软体调节输出影片格式和大小。能够有效压缩HD/4K影片体积90%以上&#xff0c;以便更好更快地上传到YouTube&#xff0c;或是通过电子邮件附件发送。业界领先的视讯压缩引擎&#xff0c;让你轻松处理大体积视…

基于可解释性特征矩阵与稀疏采样全局特征组合的人体行为识别

论文还未发表&#xff0c;不细说&#xff0c;欢迎讨论。 Title: A New Solution to Skeleton-Based Human Action Recognition via the combination usage of explainable feature extraction and sparse sampling global features. Abstract: With the development of deep …

一个.NET开发的开源跨平台二维码生成库

虽然已经有很多生成二维码的解决方案&#xff0c;但是它们大多依赖System.Drawing&#xff0c;而.NET 6开始&#xff0c;使用System.Drawing操作图片&#xff0c;在生成解决方案或打包时&#xff0c;会收到一条警告&#xff0c;大致意思是System.Drawing仅在 ‘windows’ 上受支…

完美清晰,炫酷畅享——Perfectly Clear Video为你带来卓越的AI视频增强体验

在我们日常生活中&#xff0c;我们经常会拍摄和观看各种视频内容&#xff0c;无论是旅行记录、家庭聚会还是商务演示&#xff0c;我们都希望能够呈现出最清晰、最精彩的画面效果。而现在&#xff0c;有一个强大的工具可以帮助我们实现这一目标&#xff0c;那就是Perfectly Clea…

Spring IoC容器及原理

Spring IoC容器及原理 目录 Spring IoC容器及原理 Spring BeanFactory容器 Spring ApplicationContext容器 Spring容器是Spring框架的核心。容器将创建对象&#xff0c;它们连接在一起&#xff0c;配置它们&#xff0c;并从创建到销毁管理他们的整个生命周期。在Spring容器…

大压缩作用下软基底薄膜周期性分层现象的研究

引言 通过实验、理论模型和有限元模拟的结合&#xff0c;英思特通过将一个薄膜粘接到一个预应变超过400%的软弹性衬底上&#xff0c;探索了微观和宏观尺度上控制周期性屈曲脱层形成和发展的机理。我们发现&#xff0c;在大的基底预应变释放时&#xff0c;膜中的变形遵循三阶段…

好用的截图软件Snipaste2.7.3

官网 Snipaste - 截图 贴图 下载 使用 解压 打开64位 双击运行 查看快捷键&#xff1a;选择图标&#xff0c;右键&#xff0c;弹出查看菜单

CDN体系架构及部署方案探索

如今是科技技术飞速发展的时代&#xff0c;特别是互联网技术在各个方面都得到了质的提升。对于CDN技术来说&#xff0c;该项技术的基本功能、体系构架以及运营部署等方面都取得了长足的发展&#xff0c;不仅技术日新月异&#xff0c;而且整个体系日趋成熟&#xff0c;并且不断朝…

最新Uniapp软件社区-全新带勋章源码

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件夹里面…

Python柱形图

柱形图 柱形图&#xff0c;又称长条图、柱状统计图、条图、条状图、棒形图&#xff0c;是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值&#xff08;不同时间或者不同条件&#xff09;&#xff0c;只有一个变量&#xff0c;通常利用于较小的数据集分析…

C语言之自定义类型_结构体篇(1)

目录 什么是结构&#xff1f; 结构体类型的声明 常规声明 特殊声明-匿名结构体 结构体变量的定义和初始化和访问 定义 初始化 访问 嵌套结构体 结构体的自引用 什么是结构体的自引用 NO1. NO2. 热门考点&#xff1a;结构体内存对齐 产生内存对齐 NO1 NO2 …

【TensorFlow Hub】:有 100 个预训练模型等你用

要访问TensorFlow Hub&#xff0c;请单击此处 — https://www.tensorflow.org/hub 一、说明 TensorFlow Hub是一个库&#xff0c;用于在TensorFlow中发布&#xff0c;发现和使用可重用模型。它提供了一种使用预训练模型执行各种任务&#xff08;如图像分类、文本分析等&#xf…

GPU(国内外发展,概念参数(CUDA,Tensor Core等),类别,如何选型,NPU,TPU)

目录 前言 1.国内外GPU发展简述 2.GPU概念参数和选择标准 2.1 CUDA 2.2 Tensor Core 2.3 显存容量和显存位宽 2.4 精度 2.5 如何选择GPU 3.常见GPU类别和价格 3.1 GPU类别 3.2 GPU价格&#xff08;部分&#xff09; 3.3 GPU云服务器收费标准&#xff08;以阿里云为例&a…

机器学习基础之《回归与聚类算法(1)—线性回归》

一、线性回归的原理 1、线性回归应用场景 如何判定一个问题是回归问题的&#xff0c;目标值是连续型的数据的时候 房价预测 销售额度预测 贷款额度预测、利用线性回归以及系数分析因子 2、线性回归定义 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(…

【多线程进阶】synchronized 原理

文章目录 前言1. 基本锁策略2. 加锁工作过程2.1 偏向锁2.2 轻量级锁2.3 重量级锁 3. 其他的优化操作3.1 锁消除3.2 锁粗化 总结 前言 在前面章节中, 提到了多线程中的锁策略, 那么我们 Java 中的锁 synchronized 背后都采取了哪些锁策略呢? 又是如何进行工作的呢? 本节我们就…