leetcode 978、最长湍流子数列(compare() )

当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:

若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

返回 A 的最大湍流子数组的长度。


示例 1:

输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])

示例 2:

输入:[4,8,12,16]
输出:2

示例 3:

输入:[100]
输出:1


知识点:

compareTo(Integer anotherInteger) 和 compare(int x, int y) 方法

 public int compareTo(Integer anotherInteger) {
         return compare(this.value, anotherInteger.value);
    }

compareTo 方法内部直接调用 compare 方法。


  public static int compare(int x, int y) {
         return (x < y) ? -1 : ((x == y) ? 0 : 1);
     }

如果 x < y 返回 -1

如果 x == y 返回 0

如果 x > y 返回 1

System.out.println(Integer.compare(1, 2));	//-1
System.out.println(Integer.compare(1, 1));	//0
System.out.println(Integer.compare(1, 0));	//1

思路:

如果用 -1, 0, 1 代表比较符的话(分别对应 <、 =、 >),那么我们的目标就是在符号序列中找到一个最长的元素交替子序列 1, -1, 1, -1, …(从 1 或者 -1 开始都可以)。


错误代码:

class Solution {
    public int maxTurbulenceSize(int[] A) {
        int totalNum = 1;
        int max = 1;
        for (int i = 1; i < A.length; i++) {
            int symbol = Integer.compare(A[i - 1], A[i]);
     //       if (i == 1 || symbol * Integer.compare(A[i - 2], A[i - 1]) == -1){
                totalNum++;
                if(i == A.length - 1)   max = Math.max(max, totalNum);
            }
            else {
                max = Math.max(max, totalNum);
                totalNum = 2;
            }
         }
        return max;
     }
}

symbol(符号)之间比较时不要与前面的符号比较,要和后面的比较。因为如果是类似【9,9】时,max是为1的,而【9】也唯一。所以比较特殊。
而且判断符号相乘为1时比较麻烦,判-1会好一点。

正确代码:

class Solution {
    public int maxTurbulenceSize(int[] A) {
        int anchor = 0;
        int max = 1;
        for (int i = 1; i < A.length; i++) {
            int symbol = Integer.compare(A[i - 1], A[i]);
            if (i == A.length - 1 || symbol * Integer.compare(A[i], A[i + 1]) != -1){
               if(symbol != 0) max = Math.max(max, i - anchor + 1);
                anchor = i;
         }
     } return max;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值