剑指Offer专项突击版题解六

news/2024/7/20 2:50:44 标签: 深度优先, 算法, leetcode

51.节点之和最大的路径

思路:这里考察的是后序遍历,对后序遍历每一个节点来说,当前点可以视作为终点,向上透传的时候要注意分几类情况,左右孩子最多只能选一个,或者自己也不选。

52.展平二叉搜索树

思路:中序遍历的应用,方法一:可以将中序遍历加入到slice中遍历处理,方法二,直接在遍历的过程中进行修改。

53.二叉搜索树中的中序后继

思路:两种做法,一种是根据中序遍历,记录pre的指向,第二种是根据大小关系直接进行遍历即可。

54.所有大于等于节点的值之和

思路:这是一个变形的后续遍历,只需要借助一个全局的临时变量即可。

55.二叉搜索树迭代器

思路:前序遍历的应用。

56.二叉搜索树中两个节点之和

思路:dfs+二分

57.值和下标之差都在给定的范围内

思路:普通遍历或者可以考虑滑动窗口。

58.日程表

思路:判断两个数段相交,(s1 < e2 && s2 < e1)

59.数据流的第 K 大数值

思路:go实现优先队列

type KthLargest struct {
    sort.IntSlice
    k int
}

func Constructor(k int, nums []int) KthLargest {
    kl := KthLargest{k: k}
    for _, val := range nums {
        kl.Add(val)
    }
    return kl
}

func (kl *KthLargest) Push(v interface{}) {
    kl.IntSlice = append(kl.IntSlice, v.(int))
}

func (kl *KthLargest) Pop() interface{} {
    a := kl.IntSlice
    v := a[len(a)-1]
    kl.IntSlice = a[:len(a)-1]
    return v
}

func (kl *KthLargest) Add(val int) int {
    heap.Push(kl, val)
    if kl.Len() > kl.k {
        heap.Pop(kl)
    }
    return kl.IntSlice[0]
}

60.出现频率最高的 k 个数字

思路:可以考虑一般普通解法,先用map,在用slice.sort,方法二:考虑用优先队列(heap实现的是大小根堆,通过对根堆进行出栈,就能获得升序或者降序的序列

func topKFrequent(nums []int, k int) []int {
    occurrences := map[int]int{}
    for _, num := range nums {
        occurrences[num]++
    }
    h := &IHeap{}
    heap.Init(h)
    for key, value := range occurrences {
        heap.Push(h, [2]int{key, value})
        if h.Len() > k {
            heap.Pop(h)
        }
    }
    ret := make([]int, k)
    for i := 0; i < k; i++ {
        ret[k - i - 1] = heap.Pop(h).([2]int)[0]
    }
    return ret
}

type IHeap [][2]int

func (h IHeap) Len() int           { return len(h) }
func (h IHeap) Less(i, j int) bool { return h[i][1] < h[j][1] }
func (h IHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *IHeap) Push(x interface{}) {
    *h = append(*h, x.([2]int))
}

func (h *IHeap) Pop() interface{} {
    old := *h
    n := len(old)
    x := old[n-1]
    *h = old[0 : n-1]
    return x
}


http://www.niftyadmin.cn/n/71712.html

相关文章

Java SPI 概念和应用实现

Java SPI 测试 Demo一.SPI 简介1.概念 SPI 与 API2.作用二.Jdk SPI 实现1.SPI 接口定义2.SPI 实现类定义3.SPI 配置4.测试三.SpringBoot SPI 实现1.引入 SpringBoot 依赖2.SpringBoot SPI 配置3.测试一.SPI 简介 1.概念 SPI 与 API SPI 全称&#xff1a;Service Provider Int…

XXL-JOB任务调度平台详解

一、概述XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展在平时的业务场景中&#xff0c;经常有一些场景需要使用定时任务&#xff0c;比如&#xff1a;时间驱动的场景&#xff1a;某个时间点发送优惠券&#xff0c;发送短信等…

新手小白如何入门黑客技术?

你是否对黑客技术感兴趣呢&#xff1f;感觉成为黑客是一件很酷的事。那么作为新手小白&#xff0c;我们该如何入门黑客技术&#xff0c;黑客技术又是学什么呢&#xff1f; 其实不管你想在哪个新的领域里有所收获&#xff0c;你需要考虑以下几个问题&#xff1a; 首先&#xff…

YOLO 格式数据集制作

目录 1. YOLO简介 2.分割数据集准备 3.代码展示 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01;&#xff01; 1. YOLO简介 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的目标检测和图像分割模型&#xff0c;由华盛顿大学的 Joseph Redmon 和 Al…

scrm管理系统是如何管理客户关系的

处理好客户关系管理&#xff0c;对于企业而言都是十分重要的。无论你的企业或公司的规模如何&#xff0c;提高的主要内容是客户满意度和客户相关性。如果一家公司不能很好地处理客户关系&#xff0c;就很难成功。scrm管理系统使企业能够更好地对客户进行细分&#xff0c;为客户…

win10电脑性能优化设置

win10电脑性能优化设置 目录win10电脑性能优化设置1.桌面图标显示2.wini2.1 “系统”2.1.1专注助手 关2.1.2 电源和睡眠 设置为从不2.1.3 存储 开2.2 网络和Internet2.3 个性化2.4 应用2.5 账户2.6 游戏2.7 隐私墨迹书写和键入个性化&#xff1a;关活动历史记录&#xff1a;全部…

始于日志,不止于日志,Elastic Stack全面介绍

1、Elastic Stack是什么&#xff1f; 说Elastic Stack之前&#xff0c;先说一下ELK Stack。这个词相信很多人都是耳熟能详的&#xff0c;作为一个著名的日志系统解决方案&#xff0c;应用非常广泛。 “ELK”是三个开源项目的首字母缩写词&#xff1a;Elasticsearch、Logstash…

Instagram营销教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Instagram营销初学者教程 - 从简单和简单的步骤学习Instagram营销从基本到高级概念&#xff0c;包括概述&#xff0c;业务战略&#xff0c;安装和注册&#xff0c;发布和参与&#xff0c;活动审查&#xff0c;微调内容&#xff0c;营销工具和应用程序&#xff0c;集成…