Leetcode 1340. Jump Game V

题目链接:Jump Game V

题目大意:给定一个高度数组,每个数字代表一个高度,现在有如下规则:起点任选,从某个高度(起点)可以跳到另一个高度(终点),但是要求就是他们之间的距离得不大于d,且他们之间得所有高度值都得小于起始高度(包括终点),求从某个点开始能够访问最多的高度

题目思路:首先我们可以想到一个逆向做法,我们从某个高度到比他低的高度不好做,但是如果我们知道了某一个高度的最多次数,如果某一个高度能够跳到这个高度,那么比较高的高度至少能跳的个数是当前高度+1,那么如果对于所有比当前高度低得高度,跳得个数确定了,那么这个高度实际上能跳得最多个数也就确定了,所以我们得做法其实就是从最低高度到最高得高度,开始计算,找周围比他低得高度,+1之后选最大值,一次类推,即可得到我们想要得答案,具体看代码

时间复杂度&&空间复杂度:O(n^2)&&O(n)

class Solution {
public:
    int maxJumps(vector<int>& arr, int d) {
        int len = arr.size();
        vector<pair<int,int> >vec;
        for(int i = 0;i < len;i++){
            vec.push_back({arr[i],i});
        }
        sort(vec.begin(),vec.end());
        vector<int>dp(len);
        for(int ii = 0;ii < len;ii++){
            int i = vec[ii].second;
            int now = i-1;
            while(now >= 0&&abs(i-now) <= d&&arr[now] < arr[i]){
                dp[i] = max(dp[now]+1,dp[i]);
                now--;
            }
            now = i+1;
            while(now < len&&abs(i-now) <= d&&arr[now] < arr[i]){
                dp[i] = max(dp[now]+1,dp[i]);
                now++;
            }
        }
        int maxx = 0;
        for(int i = 0;i < len;i++){
            maxx = max(maxx,dp[i]);
        }
        return maxx+1;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值