秋招突击——6/25——复习{单调队列优化——最大子序列和,单调队列优化——修剪草坪}——新作{搜索插入位置}

文章目录

    • 引言
    • 复习
      • 单调队列优化——最大子序列和
        • 个人实现
      • 单调队列优化——修建草坪
        • 个人实现
        • 参考实现
    • 新作
      • 搜搜插入位置
        • 个人实现
        • 参考实现
    • 总结

引言

  • 明天要去上海了,今天要打印很多东西,准备很多材料,包括请假,所以上午没有时间刷题和背书,这是侵占了我下午的时间做的。
  • 今天时间不能占据太久,主要做一下单调队列优化的题目,之前就做过一个。

复习

  • 还是换一下思路吧,今天还是就做一种类型的题目,把单调队列优化做了,总共是两道题,一个旧的题目——最大子序列和 以及一个新的题目——修建草坪。
  • 单调队列是后来做的,学的并不多,但是那道题我推导了很久,这里放一下对应的连接。

单调队列优化——最大子序列和

  • 上一次分析做题的链接。

  • 最大子序列和

  • 有以下几个注意点

    • 子序列和的问题,所以需要预先处理并保存所有样本的子序列和
    • 有一个子序列限制,需要保证单调子序列的范围在m之内
  • 如果使用动态规划,其实就是计算不同情况下的最优值,知道状态转移方程怎么计算。感觉这种题,和动态规划的关系并不大。

个人实现
#include <iostream>
#include <limits.h>
using namespace std;

typedef long long LL;
const int N = 300010;
LL s[N],q[N];// s表示前序和,q表示单调队列的维护
int n,k;

int main(){
    cin>>n>>k;

    // 计算前n项和
    for (int i = 1; i <= n; ++i) {
        cin>>s[i];
        s[i] += s[i - 1];
    }

    // 计算前n项队列
    int ll = 0,tt = 0;
    LL res = INT_MIN;
    q[0] = 0;  // 补充
    for (int i = 0; i <= n; ++i) {
        // 遍历这个序列的终点
        // 保证单调队列的起点和i的范围实在k以内的
        if (i - q[ll] >= k && tt >= ll)    ll ++;
        // 移动和单调递增队列中的相关值后,比较以下最小值的情况下,是否满足最终结果
        res = max(res,s[i] - s[q[ll]]);
        // 维系单调递增队列末尾元素,保证记录的都是最小的元素
        while(tt >= ll && s[q[tt]] >= s[i]) tt--;
        q[++tt] = i;
    }
    cout<<res;
}
  • 大概复习了一下,虽然知道了怎么维系单调队列,但是有以下几个细节没有注意到,分别是
    • 在每一次更新ll和tt之前,都没有对结果进行判定,保证右节点和左节点的相对关系
    • 没有初始化q[0]的值,这里面res应该是最小值才行,因为的最终的结果有可能是负数。

单调队列优化——修建草坪

在这里插入图片描述
在这里插入图片描述

重点关注

  • N的上确界是10的五次方,还有Ei的上确界是10的9次方,注意使用数据存储的方式的。
  • 不能包含超过K只编号连续的奶牛,有N只奶牛,然后有K只奶牛是不能出现连号的。保证效率最高。==》连号最多的是K个,选择最多个小于或者等于K的子序列,然后进行输出。
个人实现
  • 我这里会对问题进行拆解,那就是假设只能选一次,我现在要选一个长度小于等于K的,累加和最大的子序列,这个很好做。
    • 现在是要选出尽可能多的子序列,然后在进行匹配?但是子序列和子序列之间应该如何进行选择?这又是一个问题。
  • 若干个子序列之间应该如何选择共存?如何相互影响?
    • 想不出来,状态转换机?具体应该怎么做?拆成若干个字段,然后进行匹配应该是可以的吧!这个可以尝试一下。这边选出一个最长字串之后,然后在递归调用,然后再分割,在选择最长字串,这样应该可以做了。

大概就这样了,能不能跑起来就不看了,大概思路实现如下

#include <iostream>
#include <limits.h>
using namespace std;

typedef long long LL;
const int N = 10010;
LL s[N];// s表示前序和,q表示单调队列的维护
int n,k;
LL res = 0;

void subStr(int ll,int rr){
    if (ll > rr)    return;
    LL q[N];
    q[0] = 0;
    int hh = 0, tt = 0;
    LL tRes = 0;
    int lhh,rtt;
    for (int i = ll; i <= rr; ++i) {
        if(tt >= hh && i - q[hh] > k) hh ++;
        if (tRes < s[i] - s[q[hh]]){
            tRes = s[i] - s[q[hh]];
            lhh = q[hh];
            rtt = i;
        }
        while(tt >= hh && s[q[tt]] >= s[i]) tt--;
        q[++tt] = i;
    }
    res += tRes;
    subStr(ll,lhh - 1);
    subStr(rtt + 1,rr);
}

int main(){
    cin>>n>>k;

    // 计算前n项和
    for (int i = 1; i <= n; ++i) {
        cin>>s[i];
        s[i] += s[i - 1];
    }
    subStr(1,n);
    cout<<res<<endl;
}
参考实现
  • 这道题他的思路和我的不一样,有一个很关键的地方,使用了一个等式进行转换,我的方法应该有问题,我从最优地开始选择,最终并不一定是最优的,所以还是得好好看看他的代码。

  • 具体推导思路如下

请添加图片描述
请添加图片描述

  • 本质上,就是计算了针对g(i)的单调递减队列,找一个g(j)这个范围内的最大值,最大值,然后在进行计算的。
  • 感觉这个单调队列,理解起来还是有点问题,上一道题的理解是到位了,推导过了,这一道题,就有点问题了。
  • 想了一下,又陷入一个问题中,**注意!!**这里是前j项累加和最大,不是单个项。然后,就是再k个窗口之内,计算g(i)的最大值,保存一下单调递减队列就行了,时间有限,这里就不自己写了,直接贴上y总的代码吧
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 1e5 + 10;

int n, m;
LL s[N];
LL f[N];
int q[N];

// 公式转换的精髓。
LL g(int i)
{
    if (!i) return 0;
    return f[i - 1] - s[i];
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ )
    {
        scanf("%lld", &s[i]);
        s[i] += s[i - 1];
    }

    int hh = 0, tt = 0;
    for (int i = 1; i <= n; i ++ )
    {
        if (q[hh] < i - m) hh ++ ;
        f[i] = max(f[i - 1], g(q[hh]) + s[i]);
        while (hh <= tt && g(q[tt]) <= g(i)) tt -- ;  // 维护一个单调递减队列,保证队首的一定是最大值,这里已经维护到i的一个单调递减队列,已经是没有任何毛病的,hh是单调递减队列的头部。
        q[ ++ tt] = i;
    }

    printf("%lld\n", f[n]);

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/128401/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

新作

搜搜插入位置

  • 今天本来是一道困难的题目,但是因为要早睡,明天早上五点半要起床赶飞机,所以找了一道简单的题目,重新做一下。
  • 题目链接
    *
个人实现
  • 二分查找,然后返回l
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int searchInsert(vector<int>& nums, int t) {
    int l = 0 , r = nums.size() - 1;
    int mid = 0;
    while(l <= r){
        mid = (l + r) / 2;
        if (nums[mid] == t)     return mid;
        else if(nums[mid] < t){
            l = mid + 1;
        }else if(nums[mid] > t){
            r = mid - 1;
        }
    }
    return l;
}

在这里插入图片描述

参考实现
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/search-insert-position/solutions/333632/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

学习

  • 使用移位代替除法
  • 使用ans确定是保存大于target的最小的元素,直接返回ans即可。
  • 使用初始点加上距离的方式,不然会出错,但是出什么错我还不知道。

总结

  • 真的波折不断呀,今天下午才晚上上午的任务,难受的。不过上午的活是一定得干的,不然没有奖学金,实习又挂了,只会更难受的!
  • 总算是没有断更,找了一个简单的题,明天早上到了机场,再找个地方明天的给做了,不然又会断更的。
  • 到了上海得调整一下,目前花在算法的时间太长了,没有时间背八股,没有时间整理项目,感觉在秋招会落败。调整一下。

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

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

相关文章

领夹麦买哪个牌子的好用点?一文看懂领夹麦克风什么牌子的好

自媒体时代的兴起&#xff0c;给了普通人很多的机会&#xff0c;尤其短视频的兴起更是让无数热情&#xff0c;有创作之心的人跃跃欲试。于是乎越来越多的人纷纷拿起了手机到各个平台去展示自己的才华&#xff0c;或者通过vlog记录分享自己的简单生活。 不过在分享和创作的输出时…

电脑屏幕花屏怎么办?5个方法解决问题!

“我刚刚打开电脑就发现我的电脑屏幕出现了花屏的情况。这让我很困惑&#xff0c;我应该怎么解决这个问题呢&#xff1f;求帮助。” 在这个数字时代的浪潮中&#xff0c;电脑早已成为我们生活中不可或缺的一部分。然而&#xff0c;当你正沉浸在紧张的游戏对战中&#xff0c;或是…

第七届IAIC(成都)国际医美产业大会在蓉召开

四川省人民医院新丽美获“中国整形美容协会医疗救助与修复基金-成都市整形修复定点医院”“‘放心美 医无忧’全过程保障示范医院”两块授牌 2024年6月24日&#xff0c;第七届IAIC&#xff08;成都&#xff09;国际医美产业大会暨“医美之都”高峰会议省医院新丽美整形修复基地…

龙芯CPU架构上使用向日葵远程工具

原文链接&#xff1a;龙芯CPU架构上使用向日葵远程工具 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在龙芯CPU上使用向日葵远程控制软件的文章。向日葵是一款强大的远程控制软件&#xff0c;能够帮助用户轻松地实现远程桌面访问和控制。本文将详细介绍如何在龙芯…

Android 11 ,默认授予预置应用/APK 需要的权限,解决permission denied for window type 2003 问题。

写这篇文章的原因是解决了一个APP闪退的问题&#xff0c;闪退的原因是插拔U盘时&#xff0c;注册的广播接收者接收到广播需要弹出一个Dialog询问是否需要打开U盘&#xff0c;这个Dialog设置的是系统级别悬浮窗&#xff0c;没有这个权限&#xff0c;报错导致闪退&#xff0c;下面…

Java-拼接字符串数组(String.join()方法)

问题引入 刷算法题lc2288的时候遇见的一个小细节&#xff0c;记录一下&#xff0c;有兴趣的朋友可以做一下&#xff0c;练习一下哈哈~ 此题需要使用大家都比较熟悉的split方法将句子按照空格拆分为字符串数组。 然后再在数组中对每一个字符串操作&#xff0c;操作完成后要求…

气膜体育馆的使用年限有多少—轻空间

气膜体育馆作为一种新兴的建筑形式&#xff0c;因其独特的结构和功能而备受青睐。它不仅在建设速度、成本控制和环保方面具有显著优势&#xff0c;还在使用年限上展现出良好的性能。轻空间将探讨气膜体育馆的使用年限及其影响因素。 气膜体育馆的基本结构 气膜体育馆主要由膜材…

在数字化营销中如何提高用户参与度和留存率

在当今数字化时代&#xff0c;如何有效地提高用户参与度和留存率成为企业营销的关键课题。蚓链在此为您揭示可采取的一系列重要措施。 在提高用户参与度方面&#xff1a; 其一&#xff0c;通过深入的数据分析洞察用户偏好与行为模式&#xff0c;进而提供高度个性化的内容、精…

录制视频怎么操作?手把手教会你!

在这个互联网科技高速发展的时代&#xff0c;录制视频已经成为了人们生活中一个不可或缺的技能。无论是记录游戏精彩瞬间、制作教程、分享生活趣事&#xff0c;还是进行在线教学&#xff0c;录制视频都是一种非常直观有效的方式。可是录制视频怎么操作呢&#xff1f;本文将介绍…

运行ChatGLM大模型时,遇到的各种报错信息及解决方法

①IMPORTANT: You are using gradio version 3.49.0, however version 4.29.0 is available, please upgrade 原因分析&#xff1a; 因为使用的gradio版本过高&#xff0c;使用较低版本。 pip install gradio3.49.0 会有提示IMPORTANT: You are using gradio version 3.49.…

Javac编译器

Java语言的编译器是一段不确定的操作过程&#xff0c;可能是讲Java文件转变为class文件的过程&#xff0c;也可能是指虚拟机的后端编译&#xff0c;讲字节码转换为机器码的过程&#xff0c;还肯是静态提前编译器直接讲Java文件编译为本地机器代码的过程。 前端编译器&#xff…

DevExpress WPF中文教程:Grid - 如何排序、分组、过滤数据(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

php反序列化漏洞简介

目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…

构建家庭NAS之三:在TrueNAS SCALE上安装qBittorrent

本系列文章索引&#xff1a; 构建家庭NAS之一&#xff1a;用途和软硬件选型 构建家庭NAS之二&#xff1a;TrueNAS Scale规划、安装与配置 构建家庭NAS之三&#xff1a;在TrueNAS SCALE上安装qBittorrent 大部分家庭NAS用户应该都会装一个下载工具。本篇以qBittorrent为例&…

如何使得Macos的剪切板感知fileURL并当fileURL被执行paste 动作时 回调到某个监听的函数 从而来填充file content

问题及尝试&#xff1a; 我在做一个跨平台文件拷贝的功能&#xff0c;文件可能是从其他操作系统比如Linux 或者Windows 拷贝到Macos上&#xff0c; 但是我试过所有可以hook NSPasteboard的方法&#xff0c;确实没有找到可以监听macos 剪切板的方法&#xff0c;因为fileURL 确实…

基于STM32设计的智能家居远程调温系统(通过红外线控制空调)_75

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 设计的意义1.4 开发工具的选择1.5 系统框架图1.6 系统功能总结1.7 原理图二、硬件选型2.1 ESP8266-串口WIFI2.2 STM32F103C8T6开发板2.3 红外学…

YoloV7改进策略:SPD-Conv加入到YoloV7中,让小目标无处遁形

摘要 SPD-Conv是一种新的构建块&#xff0c;用于替代现有的CNN体系结构中的步长卷积和池化层。它由一个空间到深度&#xff08;SPD&#xff09;层和一个非步长卷积&#xff08;Conv&#xff09;层组成。 空间到深度&#xff08;SPD&#xff09;层的作用是将输入特征图的每个空…

文华WH7主图多空预警系统指标公式源码

RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;//收盘价与N周期最低值做差&#xff0c;N周期最高值与N周期最低值做差&#xff0c;两差之间做比值定义为RSV K:SMA(RSV,3,1);//RSV的移动平均 D:SMA(K,3,1);//K值的移动平均 DIFF : EMA(CLOSE,12) - EMA(CLOSE,26); D…

1uH电感SK6615电流1.5A频率2MHz输入5.5V同步降压转换器

SK6615C 1.5A 2MHz 5.5V同步降压转换器 SK6615 SOT23-5封装和丝印LA 描述 该SK6615C是一款高效、DC-DC降压型开关稳压器&#xff0c;能够提供高达1.5A的输出电流。该器件的工作输入电压范围为 2.6V 至 5.5V&#xff0c;输出电压范围为 0.6V 至 VIN。工作频率为2MHz&#xff0c…

神经网路学习7-线性模型

一个最简单的线性模型&#xff0c;w是权重&#xff0c;一般来说会取随机值&#xff0c;然后不断学习直到与预期相同 如此以此取每个值与真实值的差值&#xff0c;即评估误差 即找一个合适的权重w&#xff0c;使得平均误差最小 上面的是针对单个样本的&#xff0c;后面的是对…