如果nums[i]<=small:则
s
m
a
l
l
←
n
u
m
s
[
i
]
small \leftarrow nums[i]
small←nums[i]
否则,如果
s
m
a
l
l
≤
n
u
m
s
[
i
]
≤
m
i
d
small \leq nums[i] \leq mid
small≤nums[i]≤mid,则
m
i
d
←
n
u
m
s
[
i
]
mid \leftarrow nums[i]
mid←nums[i]
再否则,即
m
i
d
<
n
u
m
s
[
i
]
mid < nums[i]
mid<nums[i],返回真
当遍历完成后,如果还没找到则返回假
class Solution {
public boolean increasingTriplet(int[] nums) {
int mid = Integer.MAX_VALUE;
int small = Integer.MAX_VALUE;
for(int i : nums)
{
if (i <= small)
{
small = i;
}
else if(i<=mid)
{
mid = i;
}
else return true;
}
return false;
}
}
正确性证明
由于第一个分支的优先级最高,所以small一定是当前遍历到所有元素中的最小值
只要某个
n
u
m
s
[
i
]
nums[i]
nums[i]被用于执行更新small值,是不可能被用作任何满足条件元组的最大值或中间值的
一般情况下,假设
n
u
m
s
[
1
⋯
i
]
nums[1 \cdots i]
nums[1⋯i]都是非递增的,且
i
i
i是满足条件的最大值。这意味着
n
u
m
s
[
i
]
<
n
u
m
s
[
i
+
1
]
nums[i] < nums[i + 1]
nums[i]<nums[i+1]。当遍历到
n
u
m
s
[
i
]
nums[i]
nums[i]时刻,small就被更新为
n
u
m
s
[
i
]
nums[i]
nums[i],而mid还完全未被更新一次。
当遍历到
n
u
m
s
[
i
+
1
]
nums[i + 1]
nums[i+1]时,mid被更新为
n
u
m
s
[
i
+
1
]
nums[i + 1]
nums[i+1]