2786. 访问数组中的位置使分数最大

news2024/10/7 19:25:30

        这并不是一个难题,但是我确实在做题中得到了一些启发,所以记录一下

先讲一讲这个题目的做法:

        首先不难想到这是一个dp问题,(由 i 可以跳到 j ) 而且应该不难, 要不然就不是medium了,doge 那么,暴力的dp就是:

        dp[j] = max (dp[i] + nums  OR dp[j] = dp[i] + nums - x) , i<j, 前面表示nums[i] nums[j] 是同奇偶,后面是nums[i] 和 nums[j]不同奇偶,  时间复杂度是O(n^2),对于 1e5的数据会超时

         那么我们肯定是要优化的,如果做过那个最大数组元素连乘积,就会想到这就是一个dp+分类, 也就是说我们维护一下 上一个是奇数的最大值 上一个是偶数的最大值, (btw, 最大数组元素连乘积 就是维护一下 最大连乘积(正数) 和 最小连乘积(负数))

        后面就没有什么需要赘述的了,还是要看一下数据量和返回值类型 选择long long

        上代码: (我的代码,可以通过)

class Solution {
public:
    long long maxScore(vector<int>& nums, int x) { //审题一开始在0  初始化有问题
        long long lastOddMax=nums[0]%2?nums[0]:-x,lastEvenMax=nums[0]%2?-x:nums[0];
        for(int i=1;i<nums.size();i++){
            int num=nums[i];
            if(num%2){// odd
                lastOddMax=max({lastOddMax,lastOddMax+num,lastEvenMax+num-x});
            }else{//     even
                lastEvenMax=max({lastEvenMax,lastEvenMax+num,lastOddMax+num-x});
            }
        } 
        return max(lastEvenMax,lastOddMax);
    }
};

some thoughts:

        1. 第一次提交的时候,是没有通过的,经过检验发现是题目要求一开始必须在0出发,而我的代码是不要求从0出发的,也就是初始化有问题,这里说一下,既然题目要求了第一次必须从下标0开始 所以就需要赋值成一个nums[0],一个-x,   类似的如果不要求第一个从哪里开始只是要求在奇偶性改变的时候 -x ,就应该赋值成一个nums[0],一个0,可以想一想为什么,这对于想通dp / dfs的初值设置是很有好处的

        2. 第二个事情就是我定义的dp实际上表示的是 从奇数跳转过来的最大值从偶数跳转过来的最大值, 他每次都是和自己比较了一下大小的,所以最后直接返回就是了,但是这是这个题目特殊的子问题的分割方式决定的,更常见的dp是dp[i]表示一定取到nums[i]下的最优值,之后用一个循环外的变量拿到最大值, 代码应该是像这样: 这里的lastOddMax,lastEvenMax就不必和自己比较了

for(...){

        if(num%2){

                lastOddMax=max(lastOddMax+num,lastEvenMax+num-x);

                ans=max(lastOddMax,ans);

        }else{

               lastEvenMax=max(lastEvenMax+num,lastOddMax+num-x);

                ans=max(lastEvenMax,ans);

        }

}

重头戏来了:

做题顺序:
1. first        读一下题目,有一个大致的印象,是哪一个类别的(字符串,图,树),该类别一般都有什么算法

2. second  看一看数据量,O(n) O(nlogn) ... O(n^2) O(n^3)

3. third       如果感觉做过类似的题目, 那就往上面靠, 仿写  
                  没有类似的题目,想一想一些通用的思想,  dp, 贪心, sort, 递归/dfs, 二分法
    3.1 使用dp 就要想好定义, 最好能写出来i,j的含义, 同时也可以看看分类(a) [:i][:j]
                   (b)dp[i]表示选择nums[i]最优     (c) num[i]另起炉灶

    3.2 贪心  不用严格证明正确性,能够贪心一下简化一点思维就很好了,常见的可以是 sort + 贪心,                       反悔贪心: 针对于需要等待积累 让量变引起质变的题目,  循环外记录ans

    3.3 sort 可以看成是一种数据预处理or一种代价不大的贪心,  要求题目的选择是 非连续且不要求                     相对位置,针对多目标最值或者多元素结构体,可以先固定一维最好或者最差,减少思维量

    3.4 dfs/递归  对于树/图的一种普适法, 尤其对树有奇效,可以大大简化思维量,类似归纳法,只需要                     边界条件(即n=0,n=1), 递推式,(f(n)=g(f(n-1)...f(1))) 使用记忆化后可以降低时间复杂度

    3.5 二分法 针对于暴力超时,但是nlogn能过, 使用二分有个条件,就是ans左右两边一定是左边全0                     右边全1或者左边全1右边全0,ans是第一个0或者第一个1

4. 优化时空 使用特殊的数据结构

        unordered_map / map 用时间换空间                   -> multimap / val取vector

        unordered_set  / set    插入删除logn,       会去重 -> multiset(不去重)

        单调栈 单调队列

做题原则:

        1. 不管方法好坏或者时空复杂度, 第一步要做的是解出来这个题, 只有先做出来,然后再去想时空的优化,在掌握了常见算法之后, 大部分优化都是数据结构的调整, 也有一些是思路的调整,这个就说明你的第一步定位没有定位好, 也是我们要通过刷题学习积累的feel.

        2. 对于新的算法,特殊的数据结构,这个没有做出来是正常的,也不必花费时间死想,正确的姿势应该是-> 搞懂这个题, 搞懂这个模板, 刷五六道类似题目, 过一段时间回顾, 之后就自然掌握了,下一次他就应该进入你的知识库了

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

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

相关文章

mongodb 集群安装

1. 配置域名 Server1&#xff1a; OS version: CentOS Linux release 8.5.2111 hostnamectl --static set-hostname mongo01 vi /etc/sysconfig/network # Created by anaconda hostnamemong01 echo "192.168.88.20 mong1 mongo01.com mongo02.com" >> /…

【笔记】【矩阵的二分】668. 乘法表中第k小的数

力扣链接&#xff1a;题目 参考地址&#xff1a;参考 思路&#xff1a;二分查找 把矩阵想象成一维的已排好序的数组&#xff0c;用二分法找第k小的数字。 假设m行n列&#xff0c;则对应一维下标范围是从1到mn&#xff0c;初始&#xff1a; l1; rmn; mid(lr)/2 设mid在第i行&a…

【C++11】第一部分(一万六千多字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 C11简介 统一的列表初始化 &#xff5b;&#xff5d;初始化 std::initializer_list 声明 auto decltype 右值引用和移动语义 左值引用和右值引用 左值引…

C#实现WMI获取硬盘参数

文章目录 背景涉及框架及库WMI查询小工具参数解释U盘移动硬盘本机设备 总结 背景 因为需求需要涉及获取硬盘的SN参数&#xff0c;但是又不想要获取到U盘或移动硬盘设备的SN&#xff0c;所以就浅浅的研究了一下。 以下就是我目前发现的一些参数的作用&#xff0c;够我用了。。。…

QT QFileDialog文件选择对话框

QT QFileDialog文件选择对话框 选择txt或者cpp文件&#xff0c;读取内容并显示 参考&#xff1a; QT写入文件与读取文件内容_qt往一个文件写东西-CSDN博客 #include "QtFilePreview.h" #include "qfiledialog.h" #include "qfile.h" #includ…

【记录】ChatGLM3-6B大模型部署、微调(二):微调

前言 上文记录了ChatGLM3-6B大模型本地化部署过程&#xff0c;本次对模型进行微调&#xff0c;目的是修改模型自我认知。采用官方推荐微调框架&#xff1a;LLaMA-Factory 安装LLaMA-Factory # 克隆项目 git clone https://github.com/hiyouga/LLaMA-Factory.git 安装依赖 # 安装…

Android入门第68天-自动更新/升级怎么做(生产级实例)

开篇 今天我们进入第68讲。 在第60天左右其实很多同学们已经进入了APP应用开发了,因为60天内容足以让大家踏上正实的Android开发生涯。 随着开发的深入,我们发觉日常工作中无非就是一些组件的嵌套、合理应用。当代码迭代、功能迭代越来越频繁后我们面临着另一个问题,即:…

Flutter项目,Xcode15, 编译正常,但archive报错

错误提示 PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/目录/Developer/Xcode/DerivedData/Runner-brgnkruocugbipaswyuwsjsnqkzm/Build/Intermediates.noindex/ArchiveIntermediates/Runner/IntermediateBuildFilesPath/Runner.build/Release-iphoneos/Runner…

世界酒中国菜全球组委会发布2024年度VIS视觉融合潘通柔和桃色调

世界酒中国菜全球组委会发布2024年度VIS视觉 融合潘通柔和桃色调引领全球风尚 2023年12月7日&#xff0c;国际色彩权威机构&#xff08;潘通&#xff09;Pantone公司发布了2024年度代表色&#xff1a;Peach Fuzz&#xff08;PANTONE 13-1023&#xff09;柔和桃色调&#xff0…

Mybatis动态sql标签

动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。 Mybatis中实现动态sql的标签有&#x…

重生之 SpringBoot3 入门保姆级学习(22、场景整合 远程调用阿里云天气服务获取天气)

重生之 SpringBoot3 入门保姆级学习&#xff08;22、场景整合 远程调用阿里云天气服务获取天气&#xff09; 6.3 远程调用三方 API 6.3 远程调用三方 API 1、创建项目时需要选择 Spring Reactive Web 2、0元购买天气服务 API &#xff0c;我这里买了是生产中没有购买的话会显示…

洗地机哪个品牌最好用?洗地机品牌排行榜前十名

如今&#xff0c;备受大家喜爱的清洁家电莫过于洗地机啦&#xff0c;洗地机它能够一次性完成吸尘、拖地、洗地的工作&#xff0c;节省了大量的时间和精力。但是近年来&#xff0c;清洁领域的品牌基本都开始做洗地机了&#xff0c;各大品牌各式各样的洗地机可谓来势汹汹&#xf…

超万卡训练集群网络互联技术解读

超万卡训练集群互联关键技术 大模型迈向万亿参数的多模态升级&#xff0c;万卡集群计算能力亟需飞跃。关键在于增强单芯片性能、提升超节点算力、融合DPU多计算能力&#xff0c;并追求算力能效比极致。这一系列提升将强有力支撑更大规模模型训练和推理&#xff0c;快速响应业务…

Java17 --- RabbitMQ之插件使用

目录 一、Federation插件 1.1、运行两个rabbitmq实例 1.2、启用插件 1.3、在下游端点添加上游端点 1.4、创建策略 1.6、测试 二、联邦队列 2.1、创建策略 2.2、创建交换机与队列 2.2.1、创建52000的队列与交换机 2.2.2、创建62000的队列 三、Shovel 3.1、启…

谷歌上架,APP被移除了,没封号,换个包名还能重新提审上架?

对于在Google Play上架应用的开发者来说&#xff0c;尤其是那些矩阵式上架马甲包的开发者&#xff0c;可能已经遭遇过无数次应用被暂停或移除的情况了。通常这种情况下&#xff0c;账号也随之会被封&#xff0c;且大多数开发者认为&#xff0c;没有立马收到封号邮件的话&#x…

PID_Compact指令博图仿真

一、PID_Compact 指令管脚介绍 做仿真前&#xff0c;肯定要对主角有一定了解才能够按我们需要的去控制。 主要管脚介绍&#xff1a; 输入参数&#xff1a; setpoint&#xff1a;自动模式下的用户设定值&#xff1b; input&#xff1a;实际反馈值&#xff0c;非模拟量&#x…

谷歌企业开发者账号注册的常见问题及解决方法

今天跟大家分享一下注册谷歌开发者企业号的一些注意事项和干货&#xff0c;少走一些弯路。 首先&#xff0c;各位开发者朋友应该都知道&#xff0c;谷歌平台上有两种类型开发者账号&#xff1a;个人开发者账号和企业开发者账号。个人账号上架周期长&#xff0c;需要14天的封测&…

代码随想录算法训练营第二十四天| (回溯) 77. 组合、 216.组合总和III、17.电话号码的字母组合

77. 组合 题目链接&#xff1a;77. 组合 文档讲解&#xff1a;代码随想录 状态&#xff1a;很多细节忘了 思路&#xff1a;先画图&#xff0c;然后可以发现&#xff0c;从1到n中选择k个数&#xff0c;可以看成是一个递归过程&#xff0c;这个递归的深度就是k。然后遍历当前这层…

snap nextcloud 通过不被信任的域名访问

安装向导 — Nextcloud latest 管理手册 latest 文档 find / -name config.php trusted_domains >array (0 > localhost,1 > server1.example.com,2 > 192.168.1.50,3 > [fe80::1:50], ), vim /var/snap/nextcloud/42567/nextcloud/config/config.php vim /va…

Linux rm命令由于要删的文件太多报-bash: /usr/bin/rm:参数列表过长,无法删除的解决办法

银河麒麟系统&#xff0c;在使用rm命令删除文件时报了如下错误&#xff0c;删不掉&#xff1a; 查了一下&#xff0c;原因就是要删除的文件太多了&#xff0c;例如我当前要删的文件共有这么多&#xff1a; 查到了解决办法&#xff0c;记录在此。需要使用xargs命令来解决参数列表…