给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 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);
}
};
给你一个下标从 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;
}
};
给你一个长度为 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] ,这是一个美丽塔方案,因为:
输入:maxHeights = [6,5,3,9,2,7]
输出:22
解释: 和最大的美丽塔方案为 heights = [3,3,3,9,2,2] ,这是一个美丽塔方案,因为:
输入:maxHeights = [3,2,5,5,2,3]
输出:18
解释:和最大的美丽塔方案为 heights = [2,2,5,5,2,2] ,这是一个美丽塔方案,因为:
提示:
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;
}
};