给你一个下标从 0 开始的整数数组
nums
和一个整数threshold
。请你从
nums
的子数组中找出以下标l
开头、下标r
结尾(0 <= l <= r < nums.length)
且满足以下条件的 最长子数组 :
nums[l] % 2 == 0
- 对于范围
[l, r - 1]
内的所有下标i
,nums[i] % 2 != nums[i + 1] % 2
- 对于范围
[l, r]
内的所有下标i
,nums[i] <= threshold
以整数形式返回满足题目要求的最长子数组的长度。
注意:子数组 是数组中的一个连续非空元素序列。
示例 1:
输入:nums = [3,2,5,4], threshold = 5 输出:3 解释:在这个示例中,我们选择从 l = 1 开始、到 r = 3 结束的子数组 => [2,5,4] ,满足上述条件。 因此,答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。示例 2:
输入:nums = [1,2], threshold = 2 输出:1 解释: 在这个示例中,我们选择从 l = 1 开始、到 r = 1 结束的子数组 => [2] 。 该子数组满足上述全部条件。可以证明 1 是满足题目要求的最大长度。示例 3:
输入:nums = [2,3,4,5], threshold = 4 输出:3 解释: 在这个示例中,我们选择从 l = 0 开始、到 r = 2 结束的子数组 => [2,3,4] 。 该子数组满足上述全部条件。 因此,答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
1 <= threshold <= 100
方案一
暴力拆解法
参考:https://www.cnblogs.com/coderhrz/p/17835945.html
class Solution {
public:
int longestAlternatingSubarray(vector<int>& nums, int threshold) {
int i = 0;
int len = 0,count=0;
for (; i < nums.size(); ++i) {
if (nums[i] <= threshold && nums[i] % 2 == 0)
break;
}
if (i < nums.size()) {
len = 1;
count = 1;
}
else
return 0;
while (i < nums.size()-1) {
if (nums[i] % 2 != nums[i +1] % 2 && nums[i] <= threshold&& nums[i+1] <= threshold) {
i++;
count++;
len = max(count, len);
}
else
{
len = max(count, len);
i += 1;
for (; i < nums.size(); ++i) {
if (nums[i] <= threshold && nums[i] % 2 == 0)
break;
}
count = 1;
}
}
return len;
}
};
这里的解题思路是先遍历数组然后找到第一个能被2整除的数,然后记录下标,从这个数开始往后找符合要求的数。
在寻找之前需要加一个判断特殊值的条件:如果这个数组只有一个数,那就是下标会小于nums.size(),然后直接设置len=1 否则数组没有符合的值返回0。
如果数组不止一个就接着往下判断 然后符合条件就将下标和count (表示目前的长度)加1,然后每次都要比较count和len的长度随时更新最大值。
如果不符合条件也需要先保存目前更新的最大值然后从这个下标i开始重新寻找符合条件的起始点,继续循环直到跳出while 输出最大值。
总的来说这段代码只便利了一遍数组,通过随时更新最大值来寻找。
方案二
class Solution {
public:
int longestAlternatingSubarray(vector<int>& nums, int threshold) {
int res=0;
for(int i=0;i<nums.size();++i){
int temp_res=0;
if(nums[i]%2==0&&nums[i]<=threshold){
temp_res=1;
while(i+1<nums.size()&&nums[i]%2!=nums[i+1]%2&&nums[i]<=threshold&&nums[i+1]<=threshold){
++temp_res;
++i;
}
}
res=res>temp_res?res:temp_res;
}
return res;
}
};
这种解法比较简洁,直接便利一遍数组,从0开始当作起始值,然后找到第一各可以整除2并且小于threshold的点设置长度为1,然后遍历从i开始符合条件的数值,更新长度,直到不符合以后更新最大长度,直到数值遍历完成。输出最大值。