⭐北邮复试刷题1793. 好子数组的最大分数___(基于快排的划分思想/基于快排的划分思想的优化过程/基于贪心的双指针操作)__每日一题

news2025/2/25 5:35:56

Problem: 1793. 好子数组的最大分数

文章目录

  • 思路
  • Code:

在这里插入图片描述

思路

法一: 基于快排的划分思想

1.即开始为拿到数组全部 计算分数 后来对每次找到的min值的下标左右两侧进行划分 即将min去掉 从而可以构建出两个新数组;
2.对新数组继续计算分数 与前一次比较取最大 接着继续找到min值的下标 继续划分;
3.直到划分的所有数组均结束或下标出现非法继而停止则结束此过程 则此时max即为最大;

法二: 基于快排的划分思想的优化过程

1.优化划分过程 对多个min可同时划分 而不是一个一个划分;
2.即如5 5 1 4 5 4 1 —> 5 5 | 1 | 4 5 4 | 1 故只需检查5 5 和 4 5 4 即可;

法三: 基于贪心的双指针操作

1.思路即注意到好子数组一定是包括nums[k] 因此我们可以以其作为起点开始枚举;
2.若其左方为>=nums[k] 则左方可直接延长; 若其右方为>=nums[k] 则右方同理可直接延长;
3.之所以可直接延长 是因分数中min恒为nums[k] 且长度变长 因此分数是一定为增加方向的;
4.但是上述只是一种可能 因可能左右继续延长使得min为小于nums[k] 但长度增大很多 同样也可使得分数为增加方向;
5.因此我们需要枚举这几种可能 即发现只需要遍历一遍数组即可;

具体思路见代码注释;

Code:

// 法一: 基于快排的划分思想 
// 即开始为拿到数组全部 计算分数 后来对每次找到的min值的下标左右两侧进行划分 即将min去掉 从而可以构建出两个新数组
// 对新数组继续计算分数 与前一次比较取最大 接着继续找到min值的下标 继续划分 
// 直到划分的所有数组均结束或下标出现非法继而停止则结束此过程 则此时max即为最大
// class Solution {
//     int max = -1;
//     public int maximumScore(int[] nums, int k) {
//         int len = nums.length;
//         int start = 0;
//         int end = len-1;
//         cutNums(nums,start,end,k);
//         return max;
//     }

//     public void cutNums(int[] nums,int start,int end,int k){
//         // k做下标检查工作
//         if(start <= end && start <= k && end >= k){
//             int[] message = calNumsOfMinAndIndexAndSum(nums,start,end);
//             int min_temp = message[0];
//             int min_index = message[1];
//             int temp_sum = message[2];
//             max = Math.max(max,temp_sum);
//             cutNums(nums,start,min_index-1,k);
//             cutNums(nums,min_index+1,end,k);
//         }
//         // 一旦下标已经非法 则此段数组直接舍弃即可 因其再怎么移动也无法合法 因其移动为缩小方式
//         return ;
//     }

//     // 实际上 可以将每次得到的所有最小值都去除 这里只是模拟找到一个最小值下标 依据这一个进行切分的情况
//     public int[] calNumsOfMinAndIndexAndSum(int[] nums,int start,int end){
//         int[] mes = new int[3];
//         // mes[0] = nums[start];
//         // mes[1] = start;
//         // for(int i=start+1;i<=end;i++){
//         //     if(nums[i] < nums[i-1]){
//         //         mes[1] = i;
//         //         mes[0] = nums[i];
//         //     }
//         // }
//         // 下述方式避免了此段数组只有一个元素的情况 因当start==end时 使用上述则不会进入循环
//         mes[0] = Integer.MAX_VALUE;
//         mes[1] = -1;
//         for(int i=start;i<=end;i++){
//             if(nums[i] < mes[0]){
//                 mes[1] = i;
//                 mes[0] = nums[i];
//             }
//         }
//         mes[2] = mes[0]*(end-start+1);
//         return mes;
//     }
// }


// 法二: 基于快排的划分思想的优化过程
// 优化划分过程 对多个min可同时划分 而不是一个一个划分
// 即如5 5 1 4 5 4 1  --->  5 5 | 1 | 4 5 4 | 1    故只需检查5 5 和 4 5 4 即可
// class Solution {
//     int max = -1;
//     public int maximumScore(int[] nums, int k) {
//         int len = nums.length;
//         int start = 0;
//         int end = len-1;
//         cutNums(nums,start,end,k);
//         return max;
//     }

//     public void cutNums(int[] nums,int start,int end,int k){
//         // k做下标检查工作
//         if(start <= end && start <= k && end >= k){
//             List<Integer> list = calNumsOfMinAndIndexAndSum(nums,start,end);
//             int list_len = list.size();
//             max = Math.max(max,nums[list.get(0)]*(end-start+1));
//             for(int i=0;i<list_len;i++){
//                 int index = list.get(i);
//                 cutNums(nums,start,index-1,k);
//                 cutNums(nums,index+1,end,k);
//             }
//         }
//         // 一旦下标已经非法 则此段数组直接舍弃即可 因其再怎么移动也无法合法 因其移动为缩小方式
//         return ;
//     }

//     // 实际上 可以将每次得到的所有最小值都从数组中去除 根据去除的"豁口"划分出新的数组
//     // 即如5 5 1 4 5 4 1  --->  5 5 | 1 | 4 5 4 | 1    故只需检查5 5 和 4 5 4 即可
//     // 因一旦某段数组中带有此min 则其所得分数必定是还不如原先分数! 因其min和原先的相同 且长度又缩短了 故定不会实现分数增加
//     public List<Integer> calNumsOfMinAndIndexAndSum(int[] nums,int start,int end){
//         int min = Integer.MAX_VALUE;
//         for(int i=start;i<=end;i++){
//             min = Math.min(min,nums[i]);
//         }
//         List<Integer> list = new ArrayList<>();
//         for(int i=start;i<=end;i++){
//             if(nums[i] == min){
//                 list.add(i);
//             }
//         }
//         return list;
//     }
// }


// 法三: 基于贪心的双指针操作
// 思路即注意到好子数组一定是包括nums[k] 因此我们可以以其作为起点开始枚举 
// 若其左方为>=nums[k] 则左方可直接延长; 若其右方为>=nums[k] 则右方同理可直接延长;
// 之所以可直接延长 是因分数中min恒为nums[k] 且长度变长 因此分数是一定为增加方向的
// 但是上述只是一种可能 因可能左右继续延长使得min为小于nums[k] 但长度增大很多 同样也可使得分数为增加方向
// 因此我们需要枚举这几种可能 即发现只需要遍历一遍数组即可
class Solution {
    public int maximumScore(int[] nums, int k) {
        int len = nums.length;
        // 已经认为把nums[k]为置入状态 故l和r要枚举k的左右两方
        int l = k-1;
        int r = k+1;
        int score = 0;
        // i即维护此时数组中min值 初始即为nums[k] 因好子数组一定为包含nums[k]
        for(int i=nums[k];;){
            // 若能移动则移动 因此时min未变化 且长度为增大 故分数也为增大 
            while(l >=0 && nums[l] >= i){
                l--;
            }
            // 若能移动则移动 因此时min未变化 且长度为增大 故分数也为增大
            while(r < len && nums[r] >= i){
                r++;
            }
            // 求出移动后的分数
            score = Math.max(score,i*((r-1)-(l+1)+1));
            // 边界判断 若l r均出界则直接停止
            if(l < 0 && r >= len)
                break;

            // 此时此种情况下的最大分数已经计算完毕 因此需要试探下一种情况
            // 下一种情况即min进行变化(选择移动到不太小于他的元素) 再使长度增加 此时也有可能超过原先的分数 
            // 由于之前的两个while操作 故此时l和r下标对应的两个元素值都是大于之前的标准i的 
            // 我们选择较大的让min值移动
            if(l >=0 && r < len)
                i = Math.max(nums[l],nums[r]);
            else if(l == -1)
                i = nums[r];
            else 
                i = nums[l];
        }
        return score;
    }
}

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

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

相关文章

51、CR-GCN:EEG通道拓扑结构+脑功能连接捕获EEG通道关系,用于情感识别[我处理的是原始EEG数据哦]

文章&#xff1a; CR-GCN: Channel-Relationships-Based Graph Convolutional Network for EEG Emotion Recognition 单位&#xff1a; 上海大学计算机学院、上海工业计算机、喀什大学计算机学院。提出CR-GCN&#xff0c;使用GCN的邻接矩阵提取情感数据中的特征用于分类。 2…

云计算太卷了,腾讯云服务器一年61元起,2核2G3M配置

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

Flutter开发入门——路由

什么是路由&#xff1f; 移动端应用开发中&#xff0c;路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中&#xff0c;一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…

AndroidLinux GPIO控制方法

目录 1 GPIO整体架构 2 user space 层 gpio使用方法 2.1 sysfs控制方法 2.1.1 kernel版本区别 2.1.2 /sys/class/gpio 2.1.3 /sys/bug/gpio/devices 2.2 chardev控制方法 2.2.1 chardev 示例代码 2.2.2 示例代码主要步骤描述 2.2.3 include/linux/gpio.h 全部代码 2.3…

代码随想录算法训练营第四十三天|卡码网52. 携带研究材料(第七期模拟笔试)、518. 零钱兑换 II、377. 组合总和 Ⅳ

卡码网52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 刷题https://kamacoder.com/problempage.php?pid1052文章讲解https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.…

STM32通信协议

STM32通信协议 STM32通信协议 STM32通信协议一、通信相关概念二、通信协议引脚作用三、通信方式四、采样方式五、电平信号六、通信对象 一、通信相关概念 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定…

sqlserver字段2按字段1分组后;合并字段2

效果 相同dzbm的mc通过‘;’合并 sqlserver语句 按字段dzbm分组,有相同dzbm的mc通过 ;合并成一个字段,其它字段都选择第一个 SELECT dzbm, STUFF((SELECT DISTINCT ; + mc FROM tablenameWHERE dzbm = p.dzbm FOR XML PATH()), 1

Json Web Token(JWT) 快速入门

推荐视频&#xff1a;【从零开始掌握JWT】 目录 第一章 会话跟踪 01 使用Cookie和Session&#xff0c;jsessionid 02 使用token 例子一&#xff1a;自定义token 例子二&#xff1a;使用redis存储token 第一章 会话跟踪 应用背景 &#xff1a;浏览器访问web应用&#xff…

Linux工具 - 强大的vim编辑器

~~~~ 前言vim是什么为什么有vimvim怎么用vim模式介绍模式切换命令模式(Normal mode)i/a/o 切换到插入模式: 切换到底行模式R 切换到替换模式光标移动删除文字复制撤销更改 插入模式(Insert mode)底行模式(last line mode)&#xff08;需整理20240311&#xff09;替换模式vim简单…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

大势智慧与云世纪签署战略合作,实景三维赋能低空经济,泛测绘助力城市数据更新更高效

2024年《政府工作报告》提出“要大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”、“积极打造商业航天、低空经济等新增长引擎”。 近日&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;和青岛云世纪信息科技有限公司&#xf…

Portraiture2024中文版PS/LR专用智能磨皮插件

打造完美肤质&#xff0c;Portraiture PS/LR专用智能磨皮插件让你的照片焕发魅力 副标题&#xff1a;让你的照片告别粗糙皮肤和毛孔&#xff0c;展现自然细腻的肤质 在摄影后期处理中&#xff0c;给照片进行磨皮和肤质优化是一项必不可少的步骤。 而今天&#xff0c;我们为你带…

不偷看密码的超萌猫头鹰

页面结构 不偷看密码的超萌猫头鹰.css * {/* 初始化 */margin: 0;padding: 0; }body {/* 100%窗口高度 */height: 100vh;/* 弹性布局 居中 */display: flex;justify-content: center;align-items: center;/* 渐变背景 */background: linear-gradient(200deg, #72afd3, #96fbc4)…

分布式接口幂等性解析

一、概述 幂等性定义&#xff1a;用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生了副作用。【同一操作指的是同一个浏览器&#xff0c;发送相同的请求】。 常见场景&#xff1a; 提交订单接口。返回提交结果时网络出现故障&am…

如何在小程序上搭建积分商城呢_小程序搭建积分商城的优势

小程序积分商城&#xff1a;打造你的数字营销新引擎 在数字化营销的时代&#xff0c;如何有效吸引并留住用户&#xff0c;成为了每个企业都面临的重大课题。小程序积分商城&#xff0c;作为一种新兴的营销方式&#xff0c;正在以其独特的魅力&#xff0c;帮助企业实现用户增长…

Python进程与线程开发

目录 multiprocessing模块 线程的开发 threading模块 setDaemon 死锁 线程间的通信 multiprocessing模块 运行python的时候&#xff0c;我们都是在创建并运行一个进程&#xff0c;(linux中一个进程可以fork一个子进程&#xff0c;并让这个子进程exec另外一个程序)。在pyt…

MySQL如何用phpMyAdmin创建定时任务事件来执行SQL语句删除_edit_lock和_edit_last?

前面跟大家分享了『WordPress如何批量删除wp_postmeta数据表无用的_edit_lock和_edit_last数据&#xff1f;』和『宝塔面板在计划任务中怎么执行SQL语句删除_edit_lock和_edit_last&#xff1f;』&#xff0c;但是有些站长并不是使用宝塔面板&#xff0c;那么我们如何时间定时删…

阅读基础知识1

一 网络 1. 三次握手四次挥手 三次握手&#xff1a;为了建立长链接进行交互即建立一个会话&#xff0c;使用 http/https 协议 ① 客户端产生初始化序列号 Seqx &#xff0c;向服务端发送建立连接的请求报文&#xff0c;将 SYN1 同步序列号&#xff1b; ② 服务端接收建立连接…

走近 AI Infra 架构师:在高速飞驰的大模型“赛车”上“换轮子”的人

如果把大模型训练比作 F1 比赛&#xff0c;长凡所在的团队就是造车的人&#xff0c;也是在比赛现场给赛车换轮子的人。1% 的训练提速&#xff0c;或者几秒之差的故障恢复时间&#xff0c;累积起来&#xff0c;都能影响到几百万的成本。长凡说&#xff1a;“大模型起来的时候&am…

日本科技巨头富士通遭遇网络攻击,客户数据被窃

日本科技巨头富士通3月15日发布通告&#xff0c;宣称公司经历了一起网络攻击事件&#xff0c;客户个人数据已被黑客窃取。 富士通在一份通知中写道&#xff1a;“我们已经确认有几台商用计算机上存在恶意软件&#xff0c;并且经过我们的内部调查&#xff0c;发现包含个人信息和…