首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在O(n)的排序双向链表中寻找给定平均值的最长子表

在O(n)的排序双向链表中寻找给定平均值的最长子表,首先需要明确问题的具体要求和解决方案。根据问题描述,可以将问题分解为以下几个步骤来求解。

  1. 遍历链表:对于一个排序的双向链表,首先需要遍历整个链表,以获取链表的所有节点的值。
  2. 计算累积和:在遍历链表的过程中,需要累加节点的值,以得到每个节点之前的累积和。同时,还需要记录每个累积和对应的节点位置信息。
  3. 查找平均值:通过计算累积和的平均值,可以得到目标平均值。
  4. 查找最长子表:从头节点开始,遍历累积和数组,寻找与目标平均值最接近的累积和,并记录对应的节点位置。同时,使用双指针法可以确定最长子表的起始和结束位置。
  5. 输出结果:最后,根据最长子表的起始和结束位置,可以输出结果,即给定平均值的最长子表。

下面给出一个基本实现的示例代码(使用Python语言):

代码语言:txt
复制
class Node:
    def __init__(self, val):
        self.val = val
        self.prev = None
        self.next = None

def find_longest_sublist(head, target_avg):
    # Step 1: 遍历链表,获取节点值
    node_vals = []
    current = head
    while current:
        node_vals.append(current.val)
        current = current.next
    
    # Step 2: 计算累积和和位置信息
    cumulative_sum = [0] * (len(node_vals) + 1)
    pos_dict = {0: 0}
    for i in range(len(node_vals)):
        cumulative_sum[i+1] = cumulative_sum[i] + node_vals[i]
        if cumulative_sum[i+1] not in pos_dict:
            pos_dict[cumulative_sum[i+1]] = i+1

    # Step 3: 查找目标平均值
    target_sum = target_avg * len(node_vals)

    # Step 4: 查找最长子表
    start, end = 0, 0
    min_diff = float('inf')
    for i in range(1, len(cumulative_sum)):
        complement = cumulative_sum[i] - target_sum
        if complement in pos_dict:
            diff = i - pos_dict[complement]
            if diff < min_diff:
                min_diff = diff
                start = pos_dict[complement]
                end = i
    
    # Step 5: 输出结果
    if start == end:
        return None
    else:
        return node_vals[start:end]

# 示例用法
# 创建一个双向链表并设置节点值
head = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)
n5 = Node(5)
head.next = n2
n2.prev = head
n2.next = n3
n3.prev = n2
n3.next = n4
n4.prev = n3
n4.next = n5
n5.prev = n4

# 指定目标平均值
target_avg = 3.5

# 调用函数并输出结果
result = find_longest_sublist(head, target_avg)
if result is None:
    print("找不到满足条件的子表")
else:
    print("给定平均值的最长子表为:", result)

以上示例代码是一个简单的实现,能够在O(n)的时间复杂度内解决问题。但需要注意,实际应用中可能需要考虑更多的边界条件和异常处理,以及进一步的性能优化。这里只提供了一个基本的思路和实现方式,具体的应用场景和需求可以根据实际情况进行调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

最全JavaScript 算法与数据结构

每种算法和数据结构都有自己 README 并提供相关说明以及进一步阅读和 YouTube 视频。 数据结构 数据结构是计算机 组织和存储数 据一种特殊方式, 它可以高效地 访问和修改 数据。...B - 初学者, A - 进阶 B 链表 B 双向链表 B 队列 B 栈 B 哈希表 B 堆 B 优先队列 A 字典树 A 树 A 二叉查找树 A AVL 树 A 红黑树 A 线段树 - 使用 最小/最大...- 找到所有顶点对 之间最短路径 A 判圈算法 - 对于有向图和无向图 (基于DFS和不相交集版本) A 普林演算法 - 寻找加权无向图最小生成树 (MST) B 克鲁斯克尔演算法 - 寻找加权无向图最小生成树...否则回溯并继续寻找不同路径解决方案。...3628800 9.3e+157 4.02e+2567 数据结构操作复杂性 数据结构 连接 查找 插入 删除 数组 1 n n nn n 1 1 队列 n n 1 1 链表 n n 1 1 哈希表

1.4K10

备战蓝桥杯————双指针技巧巧解数组3

利用双指针技巧,一个指针从数组开头向后移动,另一个指针从数组末尾向前移动,依次交换两个指针指向元素。 最长回文子串: 找到给定字符串最长回文子串。...作者通过介绍中心扩散法,结合双指针技巧,遍历过程寻找回文子串中心点。 删除排序链表重复元素: 删除排序链表重复元素,使得每个元素只出现一次。...示例 1: 输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"] 示例 2: 输入:s = ["H","a","n","n","a","h"] 输出...对于相邻字符 s[i] 和 s[i+1],以它们为中心,利用 Pame(s, i, i+1) 寻找长度为偶数回文串。 每次扩展,更新最长回文串长度和起始位置。...函数 Pame(s, l, r) 作用是在给定字符串 s ,以指定左右指针 l 和 r 为中心,向两端扩展,寻找回文串。这个函数具体实现应该考虑到奇数长度和偶数长度情况。

12210

数据结构与算法入门手册

实现:int arr10; arr0=1; arr1=2; 链表:动态非顺序存储,节点包含值和指针,单向链表/双向链表/循环链表。适用于动态数据,插入和删除快,查找慢。...小根堆:父节点值小于子节点,getMinimum()O(1)时间内返回最小值。 字符串匹配:通过模式串文本串寻找其出现位置。KMP算法优化了暴力匹配算法。...KMP算法:通过生成前缀函数 skipi表示模式串i之前字符串中最长相同前后缀长度, 降低回溯次数。 排序:给元素序列按一定顺序进行排列。...冒泡排序:第i趟将第i大数沉到底 O(n2) 稳定 快速排序:选定pivot,小于pivot放左边,大于pivot放右边。...递归调用 O(nlogn) 不稳定 归并排序:递归地拆分序列,合并有序子序列 O(nlogn) 稳定 最短路径:寻找图中两个节点之间最短路径长度。Dijkstra算法与Floyd算法。

54940

数据结构学习笔记|链表

一般答案主要包括几个方面: 数组在内存是连续链表不是连续; 数组用下标查找时间复杂度是O(1),链表适合插入删除,时间复杂度是O(1) 日常工作基本按照上面的特点选择需要数据结构就可以了...用双向链表解决插入和删除O(n)问题 之前提到了删除和插入都可能被寻址搞成总体消耗O(n)时间复杂度。...常见缓存管理链表实现LRU时候,不可能不对此进行优化。最常见一种方式是引入一个hash表,记录每个数据链表位置,这样时间复杂度就变成O(1)了。...上面代码moveToHead函数,因为用了双向链表,所以整个函数时间复杂度就是O(1)了,如果是单向链表,则还需要遍历找到p前导结点,这样时间复杂度就很可观了。...删除排序链表重复元素 给定一个已排序链表头 head , 删除所有重复元素,使每个元素只出现一次 。返回 已排序链表

26130

66道前端算法面试题附思路分析助你查漏补缺

最后再将链表分离,通过这种方法我们也能够将时间复杂度降低为 O(n)。 26. 二叉搜索树与双向链表 题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序双向链表。...再将右子树调整为一个双向链表,并将右子树双向链表首部元素指针指向根元素,再将根节点 右节点指向首部节点。通过对左右子树递归调整,因此来实现排序双向链表构建。 27....便是数组中位数,也即是要求数,如果 index 大于 n/2,则中位数肯定在 index 左边,左边继续寻找即可,反之 右边寻找。...这样可以只 index 一边寻找,而不用两边都排序,减少了一半排序时间,这种方法时间复杂度为 O(n)。...如果数据 流读出偶数个数值,那么中位数就是所有数值排序之后中间两个数平均值。 64. 滑动窗口中最大值(待深入理解) 题目: 给定一个数组和滑动窗口大小,找出所有滑动窗口里数值最大值。

1.7K20

​LeetCode刷题实战437:路径总和 III

LeetCode刷题实战421:数组两个数最大异或值 LeetCode刷题实战422:有效单词方块 LeetCode刷题实战423:从英文中重建数字 LeetCode刷题实战424:替换后最长重复字符...LeetCode刷题实战425:单词方块 LeetCode刷题实战426:将二叉搜索树转化为排序双向链表 LeetCode刷题实战427:建立四叉树 LeetCode刷题实战428:序列化和反序列化...N 叉树 LeetCode刷题实战429:N 叉树层序遍历 LeetCode刷题实战430:扁平化多级双向链表 LeetCode刷题实战431:将 N 叉树编码为二叉树 LeetCode刷题实战...432:全 O(1) 数据结构 LeetCode刷题实战433:最小基因变化 LeetCode刷题实战434:字符串单词数 LeetCode刷题实战435:无重叠区间 LeetCode刷题实战...436:寻找右区间

26920

数据结构(二): 链表

文章目录 C链表 初识链表链表链表实现 尾插法 循环链表 寻找链表入环点 双向链表 旋转链表 STL List 3、List基本函数使用 C链表 链表C语言数据结构地位可不低...初识链表 链表是一种物理存储单元上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针链接次序实现链表由一系列结点(链表每一个元素称为结点)组成,结点可以在运行时动态生成。...由于不必须按顺序存储,链表插入时候可以达到O(1)复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号节点则需要O(n)时间,而线性表和顺序表相应时间复杂度分别是O(logn...看啊,相遇之前呢,慢指针走距离很好求:L1 = D+S1; 快指针走距离:设它在相遇前绕了n圈(n>1),那么:L2 = D+S1+n(S1+S2); 不过,还有一个等量关系,不要忽略掉,快指针速度是慢指针两倍...---- 旋转链表 这个也比较有意思啊,题目时这样给定一个当链表,让你顺时针/逆时针旋转N个位置,要求原地旋转。 我讲一下思路吧: 1、将链表自成环。

27320

【面经1】算法工程师实习校招面经 (上篇)

5.1 xn次方(x任意,n自然数) 5.2 链表排序(不能动指针) 5.3 螺旋打印二维数组 5.4 删除字符 给定一个字符串和一个数字,删除指定数字个数字符,并保证删除 给定字符串和数字 abcdabcd...O(n)排序算法 快排,归并,堆排序 5.8 二叉树路径和为给定值 5.9 一个数组,其他数出现两次,另一个出现一次,找出 改进:另外两个数出现一次 5.10 链表倒数第k个结点 5.11 判断链表对称.../链表回文 5.12 链表反转 5.13 逆序对 5.14 爬楼梯 5.15 连续子数组最大和 5.16 最长不重复子串 求一个数组只包含0,1使得其中0,1个数相等最大子数组 5.17 给定一个数组...,随机生成 0 和1 概率分别为 p 和1-p, p 不等于0.5,要求设计如下等概率生成器: 5.42 给定n个数数组,找到所有长度大于等于k连续子数组中平均值最大那个。...返回那个最大平均值。 5.43 一个 m*n 整数矩阵中找到指定值 target, 这个整数矩阵有如下性质: 5.44 给定一个无向图,这个图是一棵树基础上加上一条边构成

71330

公司数据结构+算法面试100题

1.把二元查找树转变成排序双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新结点,只调整指针指向。...49.一道看上去很吓人算法面试题(排序、算法): 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1) 50.网易有道笔试(sorry,与第39题重复): 1.求一个二叉树任意两个节点间最大距离...这道题除了考察应聘者C++基本功底外,还能考察反应能力,是一道很好题目。 60.O(1)时间内删除链表结点(链表、算法)。 题目:给定链表头指针和一个结点指针,O(1)时间删除该结点。...3.给定链表(head),如果有环的话请返回从头结点进入环第一个节点。 运用题一,我们可以检查链表是否有环。 如果有环,那么p1p2重合点p必然环中。...(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N)) 5.求两个串第一个最长子串(神州数码以前试题)。

3.2K90

数据结构面试常见问题总结

A: 数组静态分配内存,链表动态分配内存 数组在内存连续,链表不连续 数组利用下标定位,时间复杂度为 O (1),链表定位元素时间复杂度 O (n) 数组插入或删除元素时间复杂度 O (n),链表时间复杂度...时间复杂度:O (N2) Kruskal(克鲁斯卡尔)算法:含有 n 个顶点图中始终选择权值最小且不会产生回路边,一直进行此步骤直到选择 n-1 条边为止 时间复杂度:O(e*loge),e...选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列末尾。...以此类推,直到所有元素均排序完毕 插入排序:通过构建有序序列,对于未排序数据,排序序列从后向前扫描,找到相应位置并插入。...希尔排序:将整个待排序记录序列分割成为若干子序列分别进行直接插入排序 归并排序排序过程,把原来数组变成左右两个数组,然后分别进行排序,当左右子数组排序完毕之后,再合并这两个子数组形成一个新排序数组

87730

数据结构面试常见问题总结怎么写_前端数据结构与算法面试题

A: 数组静态分配内存,链表动态分配内存 数组在内存连续,链表不连续 数组利用下标定位,时间复杂度为 O (1),链表定位元素时间复杂度 O (n) 数组插入或删除元素时间复杂度 O (n),链表时间复杂度...时间复杂度:O (N2) Kruskal(克鲁斯卡尔)算法:含有 n 个顶点图中始终选择权值最小且不会产生回路边,一直进行此步骤直到选择 n-1 条边为止 时间复杂度:O(e*loge),e...选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列末尾。...以此类推,直到所有元素均排序完毕 插入排序:通过构建有序序列,对于未排序数据,排序序列从后向前扫描,找到相应位置并插入。...希尔排序:将整个待排序记录序列分割成为若干子序列分别进行直接插入排序 归并排序排序过程,把原来数组变成左右两个数组,然后分别进行排序,当左右子数组排序完毕之后,再合并这两个子数组形成一个新排序数组

59320

前端leetcde算法面试套路之双指针

寻找重复数 那是因为这里下标和值刚好没法完全重合,且有重复数,要是值也是从 0,n-1,那就没法子用值当下标的写法了题目汇总快慢指针环形链表 II寻找重复数删除有序数组重复项 II快乐数左右端点指针最接近三数之和乘积小于...K子数组有序数组平方爱吃香蕉珂珂救生艇二分法(这里只有链接,具体可以去看二分题)模板1二分查找x 平方根猜数字大小排列硬币搜索旋转排序数组 模板2第一个错误版本寻找峰值寻找旋转排序数组最小值寻找旋转排序数组最小值...II 模板3排序数组查找元素第一个和最后一个位置找到 K 个最接近元素 其他Pow(x, n)有效完全平方数寻找比目标字母大最小字母两个数组交集两个数组交集 II两数之和 II - 输入有序数组寻找重复数...寻找重复数分析 -- 双指针法(快慢指针)审题: 只有一个重复整数,而这个重复整数出现次数不确定可以用 map 用空间换时间,也可以排序之后直接找,但是这样都不符合题意之前二分法 tab 做了一次...寻找重复数这道题是可以用快慢指针做,就是将数组值当成是指向数组下标的指针,然后将整个数组转成链表;而题目就转成了,一直一个环形链表(有重复值,也就是链表中有重复指向指针),求环入口;参考寻找环形链表入口

46750

​LeetCode刷题实战435:无重叠区间

给定一个区间集合,找到需要移除区间最小数量,使剩余区间互不重叠。 注意: 可以认为区间终点总是大于它起点。 区间 [1,2] 和 [2,3] 边界相互“接触”,但没有相互重叠。...LeetCode刷题实战421:数组两个数最大异或值 LeetCode刷题实战422:有效单词方块 LeetCode刷题实战423:从英文中重建数字 LeetCode刷题实战424:替换后最长重复字符...LeetCode刷题实战425:单词方块 LeetCode刷题实战426:将二叉搜索树转化为排序双向链表 LeetCode刷题实战427:建立四叉树 LeetCode刷题实战428:序列化和反序列化...N 叉树 LeetCode刷题实战429:N 叉树层序遍历 LeetCode刷题实战430:扁平化多级双向链表 LeetCode刷题实战431:将 N 叉树编码为二叉树 LeetCode刷题实战...432:全 O(1) 数据结构 LeetCode刷题实战433:最小基因变化 LeetCode刷题实战434:字符串单词数

30620

准备程序员面试?你需要了解这 14 种编程面试模式

K 路合并 14.拓扑排序 我们开始吧! 1.滑动窗口 滑动窗口模式是用于在给定数组或链表特定窗口大小上执行所需操作,比如寻找包含所有 1 最长子数组。...大小为 K 子数组最大和(简单) 带有 K 个不同字符最长子字符串(中等) 寻找字符相同但排序不一样字符串(困难) 2.二指针或迭代器 二指针(Two Pointers)是这样一种模式:两个指针以一前一后模式在数据结构迭代...尽管使用 1 个指针进行暴力搜索或简单普通解决方案也有效果,但这会沿 O(n²) 线得到一些东西。很多情况,二指针有助于你寻找有更好空间或运行时间复杂度解决方案。 ?...你可以尝试替换其正确索引处数值,但这会带来 O(n^2) 复杂度,这不是最优,因此要用循环排序模式。 ? 如何识别这种模式?...涉及数值在给定范围内排序数组问题 如果问题要求你一个排序/旋转数组中找到缺失值/重复值/最小值 循环排序模式问题: 找到缺失值(简单) 找到最小缺失正数值(中等) 6.原地反转链表 很多问题中

1.5K30

《算法竞赛进阶指南》0x13 链表与邻接表

但也因为这样,寻找、读取数据效率不如数组高,随机访问数据操作次数是 O(n) 数组可以方便地寻找并读取数据,随机访问操作次数是 O(1) 。...但删除、插入操作次数是 O(n) 次 双向链表指针实现方式: struct Node { int value; // data Node *prev, *next; // pointers...,值得一写 链表解法是一种离线做法,步骤如下: 将原数组带着下标一起,按照元素值从小到大顺排,然后以此顺序建立双向链表 找到原数组中下标为 n 元素双向链表位置 l_i 则 \forall...| 最小值 然后双向链表删去 l_i ,接着处理原数组第 A_{n-1} 个数 删去原因是,前缀邻值不包含大于当前下标的元素 sort(a + 1, a + n + 1); for...,说一下链表做法 同上一题一样是离线做法,同时维护数组内元素值和原始下标,然后将数组按元素值从小到大排序 然后按照当前顺排顺序建立双向链表,显然对于 n 个数来说,中位数位于 \lfloor\dfrac

69920

大厂面试系列(七):数据结构与算法等

反转单链表 知道双向链表怎么翻转吗 有两个数字非常大已经超出了long型范围,现在以链表方式存储其中链表头表示最高位,例如1->2->3->4表示1234,请设计一个算法求出两数之和; 反转数字,不能把数字变成字符串...链表找环入口 单链表逆序 两个链表合并,最长公共子串问题 单链表逆序,快排,数组找两个数和等于目标值 数组 M个大小数组中找到第K大数(最大堆) 我现在有一个数组[1,2,3,4],请实现算法...给定一个非空数组,返回此数组第三大数。如果不存在,则返回数组中最大数。要求算法时间复杂度必须是O(n)。 快排会吗?知道原理吗?...实现并且设计测试用例(main函数调用,打印结果) (考虑同号越界问题) 给一个字符串和一个k,要求找到不超过k个不同字符最长子串长度 10进制转16进制(紧张了,有点费时间,啧啧啧) f(0)...=0;f(1)=1; f(n)=f(n-1)+f(n-2) 求f(n) 有主字符串A,子字符串B,A查找B

1.1K20

准备程序员面试?你需要了解这 14 种编程面试模式

K 路合并 14.拓扑排序 我们开始吧! 1.滑动窗口 滑动窗口模式是用于在给定数组或链表特定窗口大小上执行所需操作,比如寻找包含所有 1 最长子数组。...大小为 K 子数组最大和(简单) 带有 K 个不同字符最长子字符串(中等) 寻找字符相同但排序不一样字符串(困难) 2.二指针或迭代器 二指针(Two Pointers)是这样一种模式:两个指针以一前一后模式在数据结构迭代...尽管使用 1 个指针进行暴力搜索或简单普通解决方案也有效果,但这会沿 O(n²) 线得到一些东西。很多情况,二指针有助于你寻找有更好空间或运行时间复杂度解决方案。...你可以尝试替换其正确索引处数值,但这会带来 O(n^2) 复杂度,这不是最优,因此要用循环排序模式。 如何识别这种模式?...涉及数值在给定范围内排序数组问题 如果问题要求你一个排序/旋转数组中找到缺失值/重复值/最小值 循环排序模式问题: 找到缺失值(简单) 找到最小缺失正数值(中等) 6.原地反转链表 很多问题中

1.5K30

全面&详细面试指南:数据结构与算法篇 (附答案)

1.2 算法应用 典型应用1:寻找出现特定次数数字 数组只出现1次2个数字 数组中出现次数超过一半数字 统计 数字排序数组中出现次数:二分法 数组唯一出现1次数字、其他都出现了3次 典型应用...2:寻找符合特定条件数字 数组数值与下标相等元素 获取数组中最小k个数 排序数组,0~n-1缺失数字 打印从1到最大n位数:大数问题 数组重复数字(可修改 & 不可修改数组) 典型应用...链表 2.1 简介 具体请看文章:Carson带你学数据结构:线性表-链表 2.2 算法应用 典型应用1:寻找链表特定节点 链表倒数第k个节点 / 中间节点 链表中环入口节点 两个链表第一个公共节点...二叉树中和为某一值路径 二叉搜索树第k大节点 二叉树 序遍历下一个节点 典型应用5:二叉树类型变式 二叉搜索树与双向链表 输出二叉树镜像 平衡二叉树 串 1....、变位数 最长不含重复字符子字符串 替换 字符串空格 字符串排列 典型应用3:字符串排列组合 字符串排列 字符串组合 / 子集 典型应用4:字符串翻转 翻转字符串

73620
领券