话不多说,先上题。
难度中等484
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,使得 nums[i] < nums[j] < nums[k]
,返回 true
;否则,返回 false
。
先看到此题,我的思路是先创建一个二元数组,这里把原数组长度设为n,创建的二元数组为[n][2];[n][0],来保存原本的值,[n][1]来保存顺序,然后再用冒泡排序以[n][0]进行排序,第一个的顺序为最小值的顺序,然后后面如果有两个顺序比他大的,即输出true,否则输出false,这是我第一次想法的代码。
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n=nums.size();
int temp[n][2];
for(int k=0;k<nums.size();k++)
{
temp[k][0]=nums[k];
temp[k][1]=k;
}
for (int i = 0; i < nums.size()-1; i++)
{
for (int j = 0; j < nums.size() - i - 1; j++)
{
if (temp[j][0] > temp[j+1][0])
{
int temp1 = temp[j][0];
temp[j][0] = temp[j+1][0];
temp[j+1][0] = temp1;
int temp2 = temp[j][1];
temp[j][1] = temp[j+1][1];
temp[j+1][1] = temp2;
}
}
}
int temp3=0,temp4=temp[0][1];
for (int l=0;l<nums.size();l++)
{
if(temp4<temp[l][1])
{
temp3++;
temp4=temp[l][1];
}
}
if(temp3<2)
{
return false;
}
else{
return true;
}
}
};
第三十二个的时候错了,便发现了有些数据即使不满足我上面的要求,也可以满足递增三元子数列。我后面还改了一下想骗多几次看看能不能水过去(错误的想法),但确实不行。
我便重新开始审题,重新想,数组的长度最高为5*10e5,用n方的算法就可能会爆,所以必须用O(n)的算法来写,只能用一次遍历,设置两个新的int类型变量,第一个为min,第二个为mid,第一个记录目前出现的最小的数值,第二个记录比min大且比mid小的的数值,然后如果后续有mid大的数值,直接输出true。这样有人可能会问,如果后续mid后面出了比min还小的数值呢,min等于他,然后再发现了比mid大的数,岂不是直接输出了true,但是不符合题意,其实min更小,如果后面有直接比mid大的输出true的话,也是满足题意的,min更小是为了找到更小的mid,从而方便输出,于是我刚开始设置的min为nums[0],mid为nums[1],开始提交
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
if (nums.size() < 3) return false;
int min = nums[0], mid = nums[1];
for (auto num : nums) {
if (num <= min) {
min = num;
} else if (num <= mid) {
mid = num;
}
else if (num > mid) {
return true;
}
}
return false;
}
};
第六十八个的时候,这种情况下错了,但是我的思路是对的,于是我改了一下我的min和mid的初始值,改为INT_MAX,即int类型的最大值,这样做对程序没有影响,也可以使我的想法得到验证。
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
if (nums.size() < 3) return false;
int min = INT_MAX, mid = INT_MAX;
for (auto num : nums) {
if (num <= min) {
min = num;
} else if (num <= mid) {
mid = num;
}
else if (num > mid) {
return true;
}
}
return false;
}
};