LeetCode最长交替子数组如何实现所以样例?

题目描述:
给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件,我们称它是一个 交替子数组 :

m 大于 1 。
s1 = s0 + 1 。
下标从 0 开始的子数组 s 与数组 [s0, s1, s0, s1,...,s(m-1) % 2] 一样。也就是说,s1 - s0 = 1 ,s2 - s1 = -1 ,s3 - s2 = 1 ,s4 - s3 = -1 ,以此类推,直到 s[m - 1] - s[m - 2] = (-1)^m 。
请你返回 nums 中所有 交替 子数组中,最长的长度,如果不存在交替子数组,请你返回 -1 。

子数组是一个数组中一段连续 非空 的元素序列。

最新更改:

int alternatingSubarray(int* nums, int numsSize){
    int maxlength = -1,currentlength = 1;
    int i = 1,t = 1,flag = 0;
    for(i = 1;i < numsSize;i++){
        printf("%d - %d = %d,t = %d,current = %d\n",i,i-1,nums[i] - nums[i - 1],t,currentlength);
        //printf("nums[%d] - nums[i - 1] = %d,t = %d\n",i,nums[i] - nums[i - 1],t);
        if(nums[i] - nums[i - 1] != t){
            currentlength = 1;
            if(nums[i] - nums[i - 1] == 1){
                currentlength++;
                t = -1;
            }
        }else{
            currentlength++;
            flag = 1;
            t = -t;
        }
        if(currentlength > maxlength)
            maxlength = currentlength;
    }
    if(maxlength == 1 && flag != 1)
        return -1;
    return maxlength;
}

image.png
就差四个样例没有通过了,求大佬们指点!!!

阅读 855
avatarAI BotBETA

你的代码实现存在一些问题,导致无法正确判断交替子数组的长度。首先,你的变量 t 应该初始化为 1,而不是 -1。其次,在判断子数组是否满足交替条件时,应该比较 nums[i] - nums[i - 1] 是否等于 t-t,而不是直接等于 t

另外,你的代码中使用了变量 flag 来标记是否出现了连续的相等情况,但这个标记并不是必要的,可以直接在循环中判断子数组的长度。

以下是修正后的代码实现:

int alternatingSubarray(int* nums, int numsSize){
    if (numsSize < 2) {
        return -1;
    }
    int maxLength = 2;
    int currentLength = 2;
    int t = 1;
    for (int i = 2; i < numsSize; i++) {
        if (nums[i] - nums[i - 1] == t) {
            currentLength++;
        } else if (nums[i] - nums[i - 1] == -t) {
            currentLength++;
            t = -t;
        } else {
            currentLength = 2;
            t = -t;
        }
        if (currentLength > maxLength) {
            maxLength = currentLength;
        }
    }
    return maxLength > 2 ? maxLength : -1;
}

这个修正后的代码通过遍历数组,使用变量 currentLength 来记录当前交替子数组的长度,使用变量 t 来记录交替的符号。在每次迭代中,根据当前元素与前一个元素的差值来判断是否满足交替条件,并更新 currentLengtht 的值。最后返回最长的交替子数组的长度,如果不存在交替子数组,则返回 -1。

2 个回答

搞定了:

int alternatingSubarray(int* nums, int numsSize){
    int maxlength = -1,currentlength = 1;
    int i = 1,t = 1,flag = 0;
    
    for(i = 1;i < numsSize;i++){
        if(nums[i] - nums[i - 1] != t){
            currentlength = 1;
            t = 1;
            if(nums[i] - nums[i - 1] == 1){
                currentlength++;
                t = -1;
            }
        }else{
            currentlength++;
            printf("%d - %d = %d,t = %d,current = %d\n",i,i-1,nums[i] - nums[i - 1],t,currentlength);
            flag = 1;
            t = -t;
        }
        if(currentlength > maxlength)
            maxlength = currentlength;
    }
    if(maxlength == 1 && flag != 1)
        return -1;
    return maxlength;
}

for循环里面的第一个if判断加一个 t = 1就行了。

nums[i] - nums[i - 1] != t 的时候 , t 应当重置。

你只有在 nums[i] - nums[i - 1] == t 时重置了 t ,其他情况下没有处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏