365天挑战LeetCode1000题——Day 103 400题 检查二进制字符串字段 最大子序列交替和 最低票价 K 站中转内最便宜的航班

本文解析了三道算法题目并提供了代码实现:检查二进制字符串字段、最大子序列交替和、最低票价问题。通过模拟、动态规划及深度优先搜索等方法解决了这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
400题,用时103天,平均3.88题/天,预计154天,也就是5个月后完成目标

1784. 检查二进制字符串字段

在这里插入图片描述

代码实现(模拟)

class Solution {
public:
    bool checkOnesSegment(string s) {
        int pos = 1;
        while (pos != s.size() && s[pos] == '1') pos++;
        if (pos == s.size()) return true;
        while (pos != s.size() && s[pos] == '0') pos++;
        if (pos == s.size()) return true;
        return false;
    }
};

1911. 最大子序列交替和

在这里插入图片描述

代码实现(dp)

class Solution {
public:
    long long maxAlternatingSum(vector<int>& nums) {
        long long odd = 0, even = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            tie(odd, even) = tuple{max(even - nums[i], odd), max(odd + nums[i], even)};
        }
        return even;
    }
};

983. 最低票价

在这里插入图片描述

代码实现(DFS)

class Solution {
    unordered_map<int, int> mp;
    int helper(vector<int> days, vector<int>& costs) {
        if (days.empty()) return 0;
        int answer = INT_MAX;
        int curDay = days[0];
        if (mp.count(curDay)) return mp[curDay];
        auto it = days.begin();
        it = days.erase(it);
        answer = min(helper(days, costs) + costs[0], answer);
        while (it != days.end() && *it < curDay + 7) it = days.erase(it);
        answer = min(helper(days, costs) + costs[1], answer);
        while (it != days.end() && *it < curDay + 30) it = days.erase(it);
        answer = min(helper(days, costs) + costs[2], answer);
        mp[curDay] = answer;
        return answer;
    }
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
        return helper(days, costs);
    }
};

787. K 站中转内最便宜的航班

在这里插入图片描述

代码实现(Bellman-Fold)

class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
        vector<vector<int>> dp(k + 2, vector<int>(n, INT_MAX / 2));
        dp[0][src] = 0;
        int res = INT_MAX / 2;
        for (int t = 1; t <= k + 1; t++) {
            for (auto& flight : flights) {
                int i = flight[0];
                int j = flight[1];
                int dis = flight[2];
                dp[t][j] = min(dp[t][j], dp[t-1][i] + dis);
                if (j == dst) res = min(res, dp[t][j]);
            }
        }
        return res == INT_MAX / 2 ? -1 : res;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值