LeetCode 每日一题 Day 51 - 53

670. 最大交换

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。

注意:
给定数字的范围是 [0, 108]

模拟:

class Solution {
    
    
public:
    int maximumSwap(int num) {
    
    
        string s = to_string(num);
        int n = s.length();
        int max_idx = n - 1;
        int p = -1, q;
        for (int i = n - 2; i >= 0; i--) {
    
    
            if (s[i] > s[max_idx]) {
    
     
                max_idx = i;
            } else if (s[i] < s[max_idx]) {
    
     
                p = i;
                q = max_idx;
            }
        }
        if (p == -1) {
    
    
            return num;
        }
        swap(s[p], s[q]); 
        return stoi(s);
    }
};

2765. 最长交替子数组

给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件,我们称它是一个 交替子数组 :

m 大于 1 。
s1 = s0 + 1 。
下标从 0 开始的子数组 s 与数组 [s0, s1, s0, s1,…,s(m-1) % 2] 一样。也就是说,s1 - s0 = 1 ,s2 - s1 = -1 ,s3 - s2 = 1 ,s4 - s3 = -1 ,以此类推,直到 s[m - 1] - s[m - 2] = (-1)m 。
请你返回 nums 中所有 交替 子数组中,最长的长度,如果不存在交替子数组,请你返回 -1 。

子数组是一个数组中一段连续 非空 的元素序列。

示例 1:

输入:nums = [2,3,4,3,4]
输出:4
解释:交替子数组有 [3,4] ,[3,4,3] 和 [3,4,3,4] 。最长的子数组为 [3,4,3,4] ,长度为4 。
示例 2:

输入:nums = [4,5,6]
输出:2
解释:[4,5] 和 [5,6] 是仅有的两个交替子数组。它们长度都为 2 。

提示:

2 <= nums.length <= 100
1 <= nums[i] <= 1e4

从下标枚举:

class Solution {
    
    
public:
    int alternatingSubarray(vector<int>& nums) {
    
    
        int ans = -1;
        for(int i = 0;i < nums.size()-1;i++){
    
    
            int j = i;
            int cur = 1;
            while(j < nums.size()-1){
    
    
                int num = nums[j+1]-nums[j++];
                if((cur % 2)*2 -1 != num)
                    break;
                cur++;
            }
            if(cur > 1) ans = max(ans,cur);
        }
        return ans;
    }
};

2865. 美丽塔 I

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。

你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。

如果以下条件满足,我们称这些塔是 美丽 的:

1 <= heights[i] <= maxHeights[i]
heights 是一个 山脉 数组。
如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山脉 数组:

对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j]
对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= heights[k]
请你返回满足 美丽塔 要求的方案中,高度和的最大值 。

示例 1:

输入:maxHeights = [5,3,4,1,1]
输出:13
解释:和最大的美丽塔方案为 heights = [5,3,3,1,1] ,这是一个美丽塔方案,因为:

  • 1 <= heights[i] <= maxHeights[i]
  • heights 是个山脉数组,峰值在 i = 0 处。
    13 是所有美丽塔方案中的最大高度和。
    示例 2:

输入:maxHeights = [6,5,3,9,2,7]
输出:22
解释: 和最大的美丽塔方案为 heights = [3,3,3,9,2,2] ,这是一个美丽塔方案,因为:

  • 1 <= heights[i] <= maxHeights[i]
  • heights 是个山脉数组,峰值在 i = 3 处。
    22 是所有美丽塔方案中的最大高度和。
    示例 3:

输入:maxHeights = [3,2,5,5,2,3]
输出:18
解释:和最大的美丽塔方案为 heights = [2,2,5,5,2,2] ,这是一个美丽塔方案,因为:

  • 1 <= heights[i] <= maxHeights[i]
  • heights 是个山脉数组,最大值在 i = 2 处。
    注意,在这个方案中,i = 3 也是一个峰值。
    18 是所有美丽塔方案中的最大高度和。

提示:

1 <= n == maxHeights <= 1e3
1 <= maxHeights[i] <= 1e9
参考灵神题解,单调栈、前后缀分解还是不熟练:

class Solution {
    
    
public:
    long long maximumSumOfHeights(vector<int>& maxHeights) {
    
    
        int n = maxHeights.size();
        long long ans = 0;
        stack<int> s;
        vector<long long> l(n), r(n);
        for(int i = 0; i < n; i ++){
    
    
            while(!s.empty() && maxHeights[i] < maxHeights[s.top()]) s.pop();
            if(s.empty()) l[i] = 1ll * (i + 1) * maxHeights[i];
            else l[i] = l[s.top()] + 1ll * (i - s.top()) * maxHeights[i];
            s.emplace(i);
        }
        while(!s.empty()) s.pop();
        for(int i = n - 1; i >= 0; i --){
    
    
            while(!s.empty() && maxHeights[i] < maxHeights[s.top()]) s.pop();
            if(s.empty()) r[i] = 1ll * (n - i) * maxHeights[i];
            else r[i] = r[s.top()] + 1ll * (s.top() - i) * maxHeights[i];
            s.emplace(i);
        }
        for(int i = 0; i < n; i ++) ans = max(ans, l[i] + r[i] - maxHeights[i]);
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_73814009/article/details/135828404