我一直在做一些算法问题,刚刚看到了一个问题的解决方案,就像这样:

public int longestOnes(int[] nums, int k) {
  int windowStart = 0, windowEnd;
  for (windowEnd = 0; windowEnd < nums.length; ++windowEnd) {
    if (nums[windowEnd] == 0) k--;
    if (k < 0 && nums[windowStart++] == 0) k++;
  }
  return windowEnd - windowStart;
}

具体地说,在windowStart递增的部分(Nums[windowStart++]),我理解它将首先使用当前的windowStart值从nums数组中取值,然后递增.

然而,我不知道这段代码将在什么时候执行.仅当k&lt;0时?

如果是这样的话,编写如下代码是否正确:

public int longestOnes(int[] nums, int k) {
  int windowStart = 0, windowEnd;
  for (windowEnd = 0; windowEnd < nums.length; ++windowEnd) {
    if (nums[windowEnd] == 0) k--;
    if (k < 0 && nums[windowStart] == 0) k++;
    if (k < 0) windowStart++;
  }
  return windowEnd - windowStart;
}

编辑:我理解在第三个"如果"中,k已经递增,条件将不会相同.我只是试着用一种不同的方式写下第二个"如果",以此来理解它.

不知何故,它似乎给了我不同的结果.

有人知道这两种情况的区别吗?在第二种情况下(if (k < 0 && nums[windowStart] == 0) k++;)究竟发生了什么?

推荐答案

您的重写会产生不同的结果,因为您添加的第二个if判断的是new的值k,该值在前一行中已递增:

if (k < 0 && nums[windowStart] == 0) k++; // k is incremented here
if (k < 0) windowStart++; // then k is checked here

如果k-1nums[windowStart] == 0.第一行中的k将更改为0,第二行中的k < 0判断将失败,windowStart++将不会运行.

在原始版本中,只有一次k < 0判断,如果该判断为真,则运行windowStart++.

如果您希望以不将windowStart++放入数组索引的方式重写代码,您可以这样做:

if (k < 0) {
    if(nums[windowStart] == 0) {
        k++;
    }
    windowStart++;
}

我们的 idea 是,k < 0是我们做windowStart++的条件,但是在我们递增它之前的旧值windowStart用于访问array.如果k < 0nums[windowStart] == 0都为真,我们只递增k.

Java相关问答推荐

Java函数式编程中的双值单值映射

XPages-在第二次点击按钮之前延迟

Java中是否有某种类型的池可以避免重复最近的算术运算?

多重延迟签名

与不同顺序的组进行匹配,不重复组但分开

Android Java:已设置但未读取SharedPreferences

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

AbstractList保证溢出到其他方法

从12小时开始的日期模式

Java 17与Java 8双重表示法

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

基于距离的APACHE POI公式判断

升级版本后出现非法访问错误

Cucumber中第二个网页的类对象未初始化

在外部类和内部类之间,当调用外部类内部或外部的主方法时,它们的静态初始化程序的运行顺序不同

使用 JNI 的 AttachCurrentThread 方法在已附加到 JVM 的线程上执行 pthread_join 是否安全

枚举中的泛型用于复杂类型判断

迁移到新版本的Spring

Lambda 表达式正确执行,但匿名类定义抛出错误

如何更新 jpackage 安装的应用程序?