给你一个整数数组
nums
,判断这个数组中是否存在长度为3
的递增子序列。如果存在这样的三元组下标
(i, j, k)
且满足i < j < k
,使得nums[i] < nums[j] < nums[k]
,返回true
;否则,返回false
。
bool increasingTriplet(int* nums, int numsSize) {
int max = nums[0];
int i = 0;
int j = 0;
int k = 0;
int count = 1;
for(i = 1; i < numsSize; i++){
if(max < nums[i]){
max = nums[i];
count ++;
if(count == 1){
j = i;
}
else if(count == 2){
k = i;
}
else{
return true;
}
if(i == numsSize-1){
i = j;
if(i+1 < numsSize)
max = nums[i+1];
j = i+1;
count = 1;
}
continue;
}
else{
if(i == numsSize-1){
max = nums[j];
i = k;
if(k+1 == numsSize-1 || count == 1){
i = j+1;
if(i < numsSize)
max = nums[i];
count = 1;
j = i;
}
else{
count = 1;
}
}
}
}
return false;
}
还有另一种算法, INT_MAX代表的是无穷大:
bool increasingTriplet(int* nums, int numsSize) {
if (numsSize < 3) {
return false;
}
int first = nums[0], second = INT_MAX;
for (int i = 1; i < numsSize; i++) {
int num = nums[i];
if (num > second) {
return true;
} else if (num > first) {
second = num;
} else {
first = num;
}
}
return false;
}
给你一个字符串
s
,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。
s
中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串
s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。示例 1:
输入:s = "the sky is blue" 输出:"blue is sky the"
char* reverseWords(char* s) {
int len = strlen(s);
char * words = malloc((len+1)*sizeof(char));
int words_count = 0;
int words_number= 0;
int i,j = 0;
for(i = len-1; i >= 0; i--){
if(' ' != s[i]){
words_count ++;
}
else if(words_count){
if(words_number){
words[j++] = ' ';
}
memcpy(words+j, &s[i+1], words_count);
j += words_count;
words_number++;
words_count = 0;
}
}
if(!words_count){
words[j] = '\0';
}
else{
if(words_number){
words[j++] = ' ';
}
memcpy(words+j, &s[0], words_count*sizeof(char));
words[j+words_count] = '\0';
}
return words;
}