LeetCode -- 353场周赛

 找规律的小题目

c ++ 
class Solution {
public:
    int theMaximumAchievableX(int num, int t) {
        return num + t * 2;
    }
};

 

 

 

 思路,动态规划。

f[i]表示,所有从0 - i - 1中跳到点 i 的方式的执行操作次数的最小值, f[0] = 0。

另j为i后面一点,f[j] = max(f[j], f[i] + 1).

复制代码
class Solution {
    int f[1010] = {0};
public:
    int maximumJumps(vector<int>& nums, int target) {
        int n = nums.size();
        
        f[0] = 0;
        for(int i = 0; i < n; i ++ ) {
            for(int j = i + 1; j < n; j ++ ) {
                if(abs(nums[j] - nums[i]) <= target) {
                    if(!i || f[i]) f[j] = max(f[j], f[i] + 1);           
                }
            }
        }
        
        if(f[n - 1] == 0) return -1;
        return f[n - 1];
    }
};
复制代码

 

 

 

 依旧是动态规划。

f[i][0]表示第i个位置选择num1可以构建的最长非递减子数组的长度。

f[i][1]表示第i个位置选择num2可以构建的最长非递减子数组的长度。

复制代码
class Solution {
public:
    int maxNonDecreasingLength(vector<int>& nums1, vector<int>& nums2) {
        int f[100005][2] = {0};
        
        int n = nums1.size();
        f[0][0] = f[0][1] = 1;
        for(int i = 1; i < n; i ++ ) {
            f[i][0] = f[i][1] = 1;
            if(nums1[i] >= nums1[i - 1]) f[i][0] = max(f[i][0], f[i - 1][0] + 1);
            if(nums1[i] >= nums2[i - 1]) f[i][0] = max(f[i][0], f[i - 1][1] + 1);
            if(nums2[i] >= nums1[i - 1]) f[i][1] = max(f[i][1], f[i - 1][0] + 1);
            if(nums2[i] >= nums2[i - 1]) f[i][1] = max(f[i][1], f[i - 1][1] + 1);
        }
        
        int res = 0;
        for(int i = 0; i < n; i ++ ) {
            for(int j = 0; j < 2; j ++ ) {
                res = max(res, f[i][j]);
            }
        }
        return res;
        
    }
};
复制代码

 

 

 

 最后一题,差分加模拟

我们先求出nums的差分数组,在用类似滑动窗口的操作进行递推。

每次把长度为k的区间减去nums[i],利用差分可以在O(1)的时间复杂度内完成区间加减。

若其中有差分数组中的某项d[i] < 0表示无法变成0, return false

最终若所有的d[i] , 0 <= i <= n - 1, 都为0,则表示可以成功 return true

复制代码
class Solution {
public:
    bool checkArray(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> d(n + 1, 0);
        d[0] = nums[0];
        
        for(int i = 1; i < n; i ++ ) d[i] = nums[i] - nums[i - 1];
        
        for(int i = 0; i < n; i ++ ) {
            if(d[i] < 0) return false;
            if(d[i] && i + k <= n) {
                d[i + k] += d[i];
                d[i] = 0;
            }
        }
        for(int i = 0; i < n; i ++ ) {
            if(d[i]) return false;
        }
        return true;
    }
};
复制代码

 

posted @   深渊之巅  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示