IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 增量元素之间的最大差值——前缀dp -> 正文阅读

[数据结构与算法]增量元素之间的最大差值——前缀dp

题目

题目链接

题目链接

题目解析

法一:暴力枚举

此题由于是简单题,所以直接可以暴力枚举。暴力枚举的时候我们也可以考虑优化一下,比如外层枚举 n u m s [ i ] nums[i] nums[i] 的时候,内层直接找右边的最大值。

代码如下:

class Solution {
public:
    int maximumDifference(vector<int>& nums) {
        int n = nums.size();
        int ret = INT_MIN,mx;
        for(int i=0;i<n;i++){
            mx = *max_element(nums.begin()+i,nums.begin()+n);
            if(mx>nums[i])
                ret = max(ret,mx-nums[i]);
        }
        if(ret==INT_MIN)return -1;
        return ret;
    }
};

法二:dp优化

很明显,时间复杂度实际上还是 O ( n 2 ) O(n^2) O(n2) ,我们可以通过动态规划,提前求出 n u m s [ i ] nums[i] nums[i] 之前的最小值,然后我们就可以直接通过 n u m s [ i ] ? d p m i n [ i ? 1 ] nums[i]-dp_{min}[i-1] nums[i]?dpmin?[i?1] 求得,此时时间复杂度被优化为了 O ( n ) O(n) O(n) ,但空间复杂度也上升到了 O ( n ) O(n) O(n)

代码如下:

class Solution {
public:
    const int maxn = 0x3f3f3f3f;
    int maximumDifference(vector<int>& nums) {
        //计算dp值
        int n = nums.size();
        int dp_min[n];
        memset(dp_min,0x3f,sizeof(dp_min));
        dp_min[0] = nums[0];
        int ret = INT_MIN;
        for(int i=1;i<n;i++) dp_min[i] = min(dp_min[i-1],nums[i]);
        //得出答案
        for(int i=0;i<n;i++){
            if(i>0&&nums[i]>dp_min[i-1]){
                ret = max(ret,nums[i]-dp_min[i-1]);
            }
        }
        if(ret==INT_MIN)return -1;
        return ret;
    }
};

法三:进一步优化空间复杂度

我们在 d p dp dp 求解的时候发现,我们转移的状态依赖并未跨维度,而仅仅只和上一个状态 d p [ i ? 1 ] dp[i-1] dp[i?1] 相关,所以我们实际上只需要一个变量来记录 n u m s [ i ] nums[i] nums[i] 前的最小值,故把所有的处理放到一个循环中实现即可。

代码如下:

class Solution {
public:
    int maximumDifference(vector<int>& nums) {
        int n = nums.size();
        int ret = -1, premin = nums[0];
        for (int i = 1; i < n; ++i) {
            if (nums[i] > premin) {
                ret = max(ret, nums[i] - premin);
            } else {
                premin = nums[i];
            }
        }
        return ret;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-27 11:02:06  更:2022-02-27 11:03:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:28:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码