子数组类问题
子数组:
子数组是指由原数组中连续的一段或多段元素组成的数组。如果有一个数组
A
,那么它的子数组B
是A
中从某个起始位置i
到终止位置j
(满足0 <= i <= j < A.length
)的所有元素组成的数组,即B = {A[i], A[i+1], ..., A[j]}
。例如,对于数组
A = [1, 2, 3, 4, 5]
,它的子数组可以是[1]
、[2, 3]
、[1, 2, 3]
、[4, 5]
或者整个数组A
本身。子数组至少包含一个元素,且元素之间是连续排列的
既然是连续的,那么就需要确定一个起点,根据“规则”找到终点即可。
@study from EndlessCheng (灵茶山艾府) (github.com)
class Solution
{
public:int alternatingSubarray(vector<int> &nums){int ans = -1;for (int i = 0; i < nums.size() - 1; i++){// 以i为起点if (nums[i + 1] - nums[i] == 1){int start = i;int end = i+2;while (end < nums.size() && nums[end] == nums[end-2]){end ++;}ans = max(ans, end - i);}}return ans;}
};
class Solution
{
public:int maxPower(string s){int ans = 1;for (int i = 1; i < s.size(); i++){// iif (s[i] == s[i - 1]){ //int start = i;int end = i + 1;while (end<s.size() && s[end]==s[end-1]){end++;}ans=max(ans,end-start+1);}}return ans;}
};
class Solution
{
public:bool checkZeroOnes(string s){int cnt1 = 1;int cnt0 = 1;// 0for (int i = 0; i < s.size(); i++){if (s[i] == '0'){// startint e = i;while (e < s.size() && s[e] == '0'){e++;}cnt0 = max(cnt0, e - i + 1);}}// 1// 0for (int i = 0; i < s.size(); i++){if (s[i] == '1'){// startint e = i;while (e < s.size() && s[e] == '1'){e++;}cnt1 = max(cnt1, e - i + 1);}}return cnt1 > cnt0;}
};
class Solution
{
public:int longestMonotonicSubarray(vector<int> &nums){int l = 1;for (int i = 1; i < nums.size(); i++){if (nums[i] > nums[i - 1]){// startint end = i;while (end < nums.size() && nums[end] > nums[end - 1]){end++;}l = max(l, end - i + 1);}}//int r = 1;for (int i = 1; i < nums.size(); i++){if (nums[i] < nums[i - 1]){// startint end = i;while (end < nums.size() && nums[end] < nums[end - 1]){end++;}r = max(r, end - i + 1);}}return max(l,r);}
};