【发布时间】:2015-07-27 23:12:59
【问题描述】:
在算法问题“Find the Kth Smallest Element in a BST”中 (https://leetcode.com/problems/kth-smallest-element-in-a-bst),我的解决方案如下:
public class Solution {
private int count;
public int kthSmallest(TreeNode root, int k) {
if (root == null)
return 0;
int kth = kthSmallest(root.left, k);
if (count == k)
return kth;
/********** section A *************/
else if (++count == k)
return root.val;
/********** section A end *********/
/********** section B *************/
/*
else if (count == k - 1)
return root.val;
count++;
*/
/********** section B end *********/
/********** section C *************/
/*
else if (count == k - 1) {
count++;
return root.val;
}
*/
/********** section C end *********/
return kthSmallest(root.right, k);
}
}
leetcode 在线判断,A 段对,B 段错,我认为是相等的,我想不出两个段的区别。
附:添加了C部分。
-
在A部分
无论
++count == k是真还是假,计数都会增加。 -
在 B 部分
计数仅在
count == k - 1为假时增加,因为当count == k - 1为真时,函数将返回并不再执行。但是既然我们得到了正确的返回值,是不是还要增加count的值呢? -
在 C 部分
计数仅在
count == k - 1时更新 -
结论 B段不等于A,C段也不等,当我把B段和C段合并时,如下图:
else if (count == k - 1) { count++; return root.val; } count++;
相当于A段,通过了线上评委,不如A段优雅。
:)
【问题讨论】:
-
使用 B 部分时,您的代码不会编译,因为您将在下面有一个悬空的
else语句。这是你想知道的吗? -
如果您将
count++;行移到 return 语句之前,B部分将与A部分相同。 -
@Codebender 是的,有个小bug,我已经修复了,不影响我的观点。
-
@Pshemo 我已经修复了这个错误,无论“count == k - 1”是真还是假,B 节中的计数都会增加。但是网上评委上的解法还是B节不对。