java - 有关问题:查找链表的最后 N 个节点的总和
问题描述
我正在解决这个问题,实际上我确实完成了它。但是,我仍然想增强我的解决方案。是否有另一种方法来解决这个问题,从而降低时间复杂度?我的解决方案的时间复杂度是 O(n^2)。此外,我考虑了一种递归解决它的方法,但最后我将两者混合在一起;因为我将遍历“迭代”以获取numOfNodes
然后遍历“递归”以计算最后一个节点。我还没有实现它,但我对那个解决方案感到困惑,我不知道它是否正确!
**请先看代码 ,,,,,,,,,,,,,,,,,,,,,, 思路是numOfNodes
在列表中计数到,然后再过来遍历但是对于每个节点,我会减少numOfNodes
. 而当 时numOfNodes == k
,则使用 for 循环计算总和。
这是代码:
public int sum(Node head, int k){
int sum = 0;
int numOfNodes = 0;
Node temp = new Node(0);
temp = head;
while(temp != null){
numOfNodes++;
temp = temp.next;
}
temp = head;
while(temp != null){
if(numOfNodes == k){
for(int i = 0; i<k; i++){
sum += temp.data;
temp = temp.next;
}
}else{
numOfNodes--;
temp = temp.next;
}
}
return sum;
}
先感谢您!
解决方案
您的代码对列表中的节点数持乐观态度。当列表少于k
节点时,它将返回 0。我认为在这种情况下应该返回所有节点的总和。
至于算法的其余部分:很好。它使用恒定的辅助存储器并以线性时间运行。它不是你想象的二次方:虽然你在列表中循环了第二次,但这只会使迭代次数为 O(2n),仍然是 O(n)。
您还可以通过跟踪滞后k
于前导节点引用的节点的第二个节点引用,将两个迭代合并为一个。
这是看起来的样子:
public static int sum(Node head, int k){
int total = 0;
Node lag = head;
Node lead = head;
while (lead != null) {
if (--k < 0) {
total -= lag.data;
lag = lag.next;
}
total += lead.data;
lead = lead.next;
}
return total;
}
递归解决方案的缺点是需要 O(k) 堆栈空间。
推荐阅读
- java - 如何在不更新或创建根节点的情况下通过 oData 创建新的子节点实体
- node.js - 如何在nodejs中发布后执行get?
- amazon-web-services - AWS Redshift 清除策略自动化
- c# - 使用 X509Certificate2 密钥的 RSA 加密
- php - pregmatch 在href中获取文本
- sql-server - SQL Server 数据更改跟踪并显示给定时间内的数据状态
- angular - Angular routerLink 相对导航没有矩阵参数
- forms - 如何在 Symfony 4 中将表单的错误转换为字符串?
- xaml - XamarinForms 中的 UWP 流畅设计
- javascript - 音频包含在另一个 PHP 文件中时不起作用