力扣题解1014

news2024/9/24 5:59:53

大家好,欢迎来到无限大的频道。

今日继续给大家带来力扣题解。

题目描述(中等):

最佳观光组合

给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的 距离 为 j - i。

一对景点(i < j)组成的观光组合的得分为 values[i] + values[j] + i - j ,也就是景点的评分之和 减去 它们两者之间的距离。

返回一对观光景点能取得的最高分。

题目分析:

我们需要找到一对景点(i < j),使得它们的观光组合得分最大。组合得分的计算方式是 values[i] + values[j] + i - j。这一公式可以拆分为 (values[i] + i) + (values[j] - j)。这样,我们的问题就可以转化为:在遍历到位置 j 时,找一个最优的 i 使得 (values[i] + i) 最大。

这样,我们可以通过线性扫描数组来完成任务。

解题思路:

  1. 初始化变量:我们需要两个变量:max_score 用来存储最大的得分,max_i 用来存储最大 values[i] + i。

  2. 遍历数组:从第二个元素(j = 1)开始遍历 values。

    • 计算当前组合得分:对于每个 j,计算 current_score 为 max_i + values[j] - j。

    • 更新最大得分:如果 current_score 大于 max_score,更新 max_score。

    • 更新 max_i:在每一步,更新 max_i 为 max(max_i, values[j] + j)。这是为了保证后续位置 j 使用到最优的 i。

  3. 返回最大得分:最终返回 max_score。

参考代码如下:

int maxScoreSightseeingPair(int* values, int valuesSize) {
    // 初始化 max_i 为第一个元素的值加上它的索引
    int max_i = values[0] + 0;
    int max_score = 0;
​
    // 从第二个元素开始遍历
    for (int j = 1; j < valuesSize; j++) {
        // 计算当前组合的得分
        int current_score = max_i + values[j] - j;
        // 更新最优得分
        if (current_score > max_score) {
            max_score = current_score;
        }
        // 更新 max_i,使其为当前元素的值加上它的索引,或者保持为之前的最大值
        if (values[j] + j > max_i) {
            max_i = values[j] + j;
        }
    }
​
    return max_score;
}

    ​这个算法虽然没有显式地使用动态规划的传统形式(例如,使用表格存储子问题的解),但它确实利用了一种动态规划的思想来优化计算过程。让我们深入分析一下。

动态规划的基本思想

动态规划(Dynamic Programming, DP)通常用于解决可以分解为重叠子问题的优化问题。它的核心思想是通过保存已经计算过的结果来避免重复计算,从而提高效率。动态规划通常涉及以下几个步骤:

1. 定义状态:明确需要存储的信息。

2. 建立状态转移方程:确定如何从已知状态推导出新状态。

3. 初始化状态:设置初始条件。

4. 计算结果:根据状态转移方程计算最终结果。

在这个算法中的运用

在 `maxScoreSightseeingPair` 函数中,虽然没有使用表格来存储中间结果,但它通过以下方式实现了动态规划的思想:

1. 定义状态:

   - `max_i` 代表在当前元素之前(即 `j` 的前一个元素)可以获得的最大得分 `values[i] + i`。这个状态在每一步中都在更新。

2. 状态转移:

   - 在每次循环中,我们通过 `max_i` 来计算当前得分 `current_score`。这个得分依赖于之前的状态 `max_i` 和当前的 `values[j] - j`。这样,我们实际上在用 `max_i` 的值来动态计算出当前 `j` 的最优得分。

3. 初始化状态:

   - `max_i` 初始为 `values[0] + 0`,这是我们在计算中需要的第一个状态。

4. 计算结果:

   - 通过遍历整个数组,更新 `max_score` 和 `max_i`,最终得到最大得分。

虽然这个算法没有使用动态规划的典型方式(如二维数组或一维数组来存储多个状态),但它确实利用了动态规划的核心思想:通过维护一个状态(`max_i`),在遍历过程中动态更新并计算结果。

因此,可以说这个算法在某种程度上是基于动态规划的思想,但它的实现方式更为简洁,使用了常量级的空间来存储状态,而不是使用一个完整的 DP 表。

复杂度:

时间复杂度:

在代码中,我们只进行了一次遍历,遍历了整个数组 values。具体分析如下:

  • 遍历数组:我们使用一个 for 循环从 j = 1 到 valuesSize - 1,这意味着循环的次数是 n-1,其中 n 是数组的长度。

  • 每次迭代的操作:在循环体内,我们进行了一些常数时间的操作(如加法、比较、赋值等),这些操作的时间复杂度都是 O(1)。

因此,整个算法的时间复杂度为 O(n),其中 n 是数组 values 的长度。

空间复杂度:

在空间复杂度方面:

  • 使用的额外空间:我们只使用了几个额外的变量(max_i、max_score 和 current_score),这些变量占用的空间是常数级别的。

  • 输入数组:我们没有使用任何额外的数据结构来存储数据,输入数组 values 在空间复杂度的计算中不被考虑。

因此,整个算法的空间复杂度为 O(1),即只使用了常量级的额外空间。

总结

  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

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

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

相关文章

C++ | Leetcode C++题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class AllOne {list<pair<unordered_set<string>, int>> lst;unordered_map<string, list<pair<unordered_set<string>, int>>::iterator> nodes;public:AllOne() {}void inc(string key) {if (…

R语言 基础笔记 2

起因&#xff0c; 目的: 偶然看到一个新的教程&#xff0c; 有些知识点&#xff0c;以前没见过&#xff0c;不熟悉&#xff0c; 现在遇到了&#xff0c;记录一下。 基础数据类型 2L&#xff0c; 表示整数 3 ^ 2, 表示求幂 class(a) 查看 类 typeof(a) 查看基本数据类型 s…

C/C++语言基础--C++构造函数、析构函数、深拷贝与浅拷贝等等相关知识讲解

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 周末休息了&#xff0c;没有更新&#xff0c;请大家见谅哈&#xff1b;构造函数、析构函数可以说便随着C每一个程序&#xff0c;故学构造函数、析构函数是必要的&#xff1b;C语言后面也会继续更新知识点&am…

Linux 环境(rhel6.4)oracle11.2.0.1升级到11.2.0.4

停止监听 [oraclerhel64 ~]$ lsnrctl stop 关闭数据库 [oraclerhel64 ~]$ sqlplus / as sysdba SYSNKYYDB>shutdown immediate; 上传软件包并解压 [rootrhel64 ~]# mkdir /u01/upgrade [rootrhel64 ~]# chown -R oracle:oinstall /u01/upgrade/ [oraclerhel64 upgrad…

MySQL(学习笔记)(02)(进阶篇)

P1 存储引擎 MySQL的体系结构 存储引擎简介 存储引擎的选择 P2 索引&#xff08;重要&#xff09; 索引概述 索引结构 二叉树 B树&#xff08;多路平衡查找&#xff09; B树 hash 总结 索引分类 思考题 索引语法 SOL性能分析 索引使用 索引设计原则 P3 SQL优化 P4 视图/存储过…

前端vue-3种生命周期,只能在各自的领域使用

上面的表格可以简化为下面的两句话&#xff1a; setup是语法糖&#xff0c;下面的两个import导入是vue3和vue2的区别&#xff0c;现在的vue3直接导入&#xff0c;比之前vue2简单 还可以是导入两个生命周期函数

基于Nginx搭建点播直播服务器

实现直播和点播离不开服务器⽀持&#xff0c;可以使用开源的NGINX服务器搭建直播和点播服务。 当然&#xff0c;NGINX本身是不⽀持视频的&#xff0c;需要为NGINX增加相应的RTMP模块进行支持。 1、下载nginx和rtmp模块 # nginx wget ht tp://nginx.org/download/nginx-1.18.…

一篇讲完HTML核心内容

一、HTML 1、 HTML概念 网页&#xff0c;是网站中的一个页面&#xff0c;通常是网页是构成网站的基本元素&#xff0c;是承载各种网站应用的平台。通俗的说&#xff0c;网站就是由网页组成的。通常我们看到的网页都是以htm或html后缀结尾的文件&#xff0c;俗称 HTML文件。 2、…

公安局党建平台建设方案和必要性-———未来之窗行业应用跨平台架构

一、建设必要性 1. 适应时代发展需求 - 利用信息技术提升党建工作的效率和覆盖面&#xff0c;符合数字化时代的发展趋势。 2. 提高学习教育效果 - 打破时间和空间限制&#xff0c;让党员能够随时随地获取学习资源&#xff0c;进行自主学习。 3. 加强党组织管理 …

黑马智数Day3

渲染基础Table列表 封装接口&#xff1a; export function getCardListAPI(params) {return request({url: /parking/card/list,params}) } 具体实现&#xff1a; import { getCardListAPI } from /apis/cardexport default {data() {return {// 请求参数params: {page: 1,pa…

【计算机网络 - 基础问题】每日 3 题(十九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

基于Spark框架实现LightGBM模型

基于Spark框架实现LightGBM模型 原生的Spark MLlib并不支持LightGBM算法的实现&#xff0c;但SynapseML提供了一种解决方案&#xff0c;使得我们可以在Spark中调用LightGBM。LightGBM是一种基于梯度提升决策树的高效机器学习框架&#xff0c;它专门用于创建高质量的决策树算法…

计算机毕业设计选题推荐-基于python的养老院数据可视化分析

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、养老院数据可…

Java后端面试题(微服务相关2)(day13)

目录 Gateway的三大属性Gateway的三大案例组件为什么要用服务网关不同服务之间如何进行通信在微服务中如何监控服务Openfeign如何使用Openfeign自定义拦截器Seata中2PC和3PC的区别项目的几种发布方式和特点MongoDB和mysql区别什么是分布式锁&#xff0c;Redisson有什么用&#…

人工智能面试题(Artificial Intelligence Algorithm Interview Questions)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

JavaWeb--纯小白笔记06:使用Idea创建Web项目,Servlet生命周期,注解,中文乱码解决

使用Idea创建一个web项目----详细步骤配置&#xff0c;传送门&#xff1a;http://t.csdnimg.cn/RsOs7 src&#xff1a;放class文件 web&#xff1a;放html文件 out&#xff1a;运行过后产生的文件 一创建一个新的web项目(配置好了后)&#xff1a; 在src创建一个文件…

使用【Sa-Token】实现Http Basic 认证

使用Sa-Token开源架构快速实现Http Basic 认证&#xff0c;如上图 1、springboot环境下直接添加starter即可 <!-- Sa-Token 权限认证&#xff0c;在线文档&#xff1a;https://sa-token.cc --> <dependency><groupId>cn.dev33</groupId><artifactI…

基于gorm.io/sharding分表中间件使用案例

项目背景 项目中需要用到mysql的分表场景&#xff0c;调研了一些常用的分库分表中间件&#xff0c;比如&#xff0c;mycat&#xff0c;小米的Gaea&#xff0c;这两个中间件太重了&#xff0c;学习成本较大&#xff0c;另外mycat不是go写的。我们需要一个轻量级的go版本的分表中…

Docker与Kubernetes学习

基本概述 Docker 是一个流行的容器化平台&#xff0c;允许开发人员在容器中创建、部署和运行应用程序。 Docker 提供了一组工具和 API&#xff0c;使开发人员能够构建和管理容器化应用程序&#xff0c;包括 Docker Engine、Docker Hub 和 Docker Compose。 Kubernetes 是一个…

MySQL如何实现并发控制?(上)

前言 最开始学习数据库的时候都会被问到一个问题&#xff1a;“数据库系统相比与文件系统最大的优势是什么&#xff1f;”。具体的优势有很多&#xff0c;其中一个很重要的部分是&#xff1a;数据库系统能够进行更好的并发访问控制。 那么&#xff0c;数据库系统到底是怎么进…