【算法】Day06

news2024/12/27 9:55:06

努力经营当下,直至未来明朗!

文章目录

  • 1. BST二叉搜索树的后序遍历序列
  • 2. 二叉树中和为某一值的路径(二)[回溯法]
  • 3. 字符串的排列 [全排列问题]
  • 4. 最小的K个数 [topK问题]


普通小孩也要热爱生活!

1. BST二叉搜索树的后序遍历序列

二叉搜索树的后序遍历

1)思路

① 首先复习二叉搜索树的概念:空树 or (左子树结点值一定小于根结点&&右子树结点值一定大于根结点值)【所有子树都要满足】
② 后序遍历:左右根
③ 后序遍历的特征:最后一个是root,然后前面的部分可以被分为两段,一段小于root(左子树),一段大于root(右子树);而每一段也是类似的,最后的是该段root,其余又可以分为两段。【区间划分】
递归操作,操作左右子树
⑤ 一定要注意true的条件!

2)代码

public class Solution {
    // 前闭后闭
    public boolean VerifySquenceOfBSTHelper(int [] sequence,int start,int end) {
        // 一定不要忘记正确输出的条件!!
        if(start >= end) {
            return true;
        }

        int root = sequence[end]; // 后序遍历最后一个是根结点
        int i = start;
        // 先找小于根结点的-》属于左子树
        while(sequence[i]<root) {
            i++;
        }
        // 来到这儿,说明i的位置已经是>=root
        for(int j=i; j<end; j++) {
            // 一旦遇到小于root的就说明不是后序遍历
            if(sequence[j] <= root) {
                return false;
            }
        }

        // 此时的排列[start,i,end/root]
        return VerifySquenceOfBSTHelper(sequence,start,i-1)&&
        VerifySquenceOfBSTHelper(sequence,i,end-1);

    }


    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence==null || sequence.length==0) {
            return false;
        }

        return VerifySquenceOfBSTHelper(sequence,0,sequence.length-1);
    }
}

2. 二叉树中和为某一值的路径(二)[回溯法]

二叉树中和为某一值的路径(二)

1)思路
回溯法

① 路径是指从根节点到叶子节点
② 路径可能有多条,那就要输出所有的路径
③ 核心:[回溯法] 先添加值至待选结果,再判定现有结果是否满足条件(剪枝操作),接着DFS深度优先遍历,最后进行回退检测下一个。(如果找到一条完整的满足条件的待选结果就添加到结果集中)
④ 判定结果是否满足条件:减法(预期值-当前值 ==0 ?) or 加法(相加是否已经超过预期值);最终结束标志是已经遍历到叶子节点且达到预期值。
⑤ 注意:深浅拷贝问题!! ret.add(new ArrayList<Integer>(tmp));
⑥ 回溯法:基于二叉、多叉树的穷举过程(深度优先遍历DFS),在穷举的过程中要进行剪枝操作。

2)代码

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    // 进行DFS
    private static void FindPathDFS(TreeNode root,int expectNumber,ArrayList<ArrayList<Integer>> ret,ArrayList<Integer> tmp) {
        // 这里注意不要遗漏结束退出的条件
        if(root == null) {
            return;
        }

        // 添加值到待选结果中
        tmp.add(root.val);
        
        // 剪枝操作
        // 判断&条件更新(使用减法,与预期结果进行比较)
        expectNumber -= root.val;
        // 注意这里不要遗漏正确的条件判断
        // 也就是此时待选结果已经合法,需要添加到结果集中
        if(root.left==null && root.right==null && expectNumber==0) {
            // 一定要注意深浅拷贝!!
            ret.add(new ArrayList<Integer>(tmp));
        }

        // 进行深度优先遍历(左右子树)
        FindPathDFS(root.left,expectNumber,ret,tmp);
        FindPathDFS(root.right,expectNumber,ret,tmp);

        // 进行回退(移除当前的最后一个元素值)
        tmp.remove(tmp.size()-1);
    }

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) {
        // 声明结果集与待选结果
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        ArrayList<Integer> tmp = new ArrayList<>();
        if(root == null) {
            return ret;
        }

        // 此时进行深度优先遍历DFS
        FindPathDFS(root,expectNumber,ret,tmp);
        return ret;
    }
}

3. 字符串的排列 [全排列问题]

字符串的排列

1)思路

① “字典序”问题使用TreeSet来解决,是根据key来进行排列的,key不能为空。
② 其实也是“回溯算法”的思路[穷举+剪枝]:多叉树,但是只要出现过的节点后面就不再出现!
③ 每个字母都做一次开头(循环+交换),然后余下的是子问题(子问题采用深度优先遍历DFS+回退)
④ “剪枝”其实就是去重操作
⑤ String类型不能直接操作,所以要么转为可变字符串操作,要么转为字符数组
引用类型注意深浅拷贝问题!!

2)代码

import java.util.ArrayList;
import java.util.TreeSet;

public class Solution {
    // 交换
    private static void swap(char[] ch,int start,int i) {
        char tmp = ch[start];
        ch[start] = ch[i];
        ch[i] = tmp;
    }
    // 进行排列
    private static void PermutationHelper(char[] ch,int start,TreeSet<String> tmp) {
        // 同样先判断
        if(ch.length==0 || ch==null || start<0 || start>ch.length-1) {
            return ;
        }
        // 此时就要进行排列
        // 出口:需要将一条记录插入到tmp中
        if(start == ch.length-1) {
            // 此时说明已经走到了最后
            tmp.add(String.valueOf(ch));
        } else {
            // 此时就说明排列还没有结束,需要继续排列
            // 排列:交换+排列+交换回来
            // start永远指向的是还未进行交换的开头位置!!
            // 需要进行循环,使得每一个字母都有机会当开头
            // 注意i的开始是start,不是0,start是会变化的!
            for(int i=start; i<ch.length; i++) {
                swap(ch,start,i);
                PermutationHelper(ch,start+1,tmp);
                swap(ch,start,i);
            }
        }
    }
    public ArrayList<String> Permutation(String str) {
       // 存储最终结果集
       ArrayList<String> ret = new ArrayList<>();
       // 判断是否是空串
       if(str==null || str.length()==0) {
        return ret;
       }
       // 为了得到字典序,先将结果存储在TreeSet中(直接按字典序排列)
       TreeSet<String> tmp = new TreeSet<>();
       // 为了便于后续操作字符串,先转为字符数组
       char[] ch = str.toCharArray();
       // 开始进行排列:传入字符串,从0开始,先暂存到tmp中
       PermutationHelper(ch,0,tmp);
       // 然后将结果存到ret结果集中
       // addAll就是将tmp里面的每一条记录(String)都存入ret中
       // 类型也是符合的!
       ret.addAll(tmp);
       return ret;
    }
}

4. 最小的K个数 [topK问题]

面试常问!!
最小的K个数

1)思路

① 直接升序排列(但是不考虑
② 采用大根堆的方式【重点】:先拿K个元素,因为要的是最小的K个元素,所以就将余下的元素依次与目前K个元素中的最大(堆顶)比较,大的出去小的留下。
③ 大根堆、小根堆可以使用优先级队列,注意参数的使用。
④ 补充:java官方文档:java官方文档
⑤ 优先级队列参数:
0
⑥ 优先级队列默认是升序排列,但是大根堆是降序排列
⑦ 注意:最小K个则建立大根堆,因为要将堆顶最大的弹出去!

2)代码

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Collections;

    // 最小k个,那就建立大根堆(使用优先级队列)
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        // 存储结果的链表
        ArrayList<Integer> ret = new ArrayList<>();
        // 进行判断
        if(input==null || input.length<k || k<=0) {
            return ret;
        }

        // 满足条件的话就开始建立大根堆并比较
        // 参数是容量+排序方式
        // 优先级队列默认是升序
        PriorityQueue<Integer> queue = new PriorityQueue<>(k,Collections.reverseOrder());
        // 插入元素+判断
        for(int i=0; i<input.length; i++) {
            if(i < k) {
                // 首先随便插入k个元素
                queue.offer(input[i]);
            } else {
                // 这里开始就要开始与堆顶元素比较了
                if(input[i] < queue.peek()) {
                    queue.poll();
                    queue.offer(input[i]);
                }
            }
        }

        // 最后将满足条件的k个数存入到ret中
        for(int i=0; i<k; i++) {
            ret.add(queue.poll());
        }

        return ret;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IF:6+ 综合分析揭示了一种炎症性癌症相关的成纤维细胞亚型在预测膀胱癌患者的预后和免疫治疗反应方面具有重要意义...

桓峰基因的教程不但教您怎么使用&#xff0c;还会定期分析一些相关的文章&#xff0c;学会教程只是基础&#xff0c;但是如果把分析结果整合到文章里面才是目的&#xff0c;觉得我们这些教程还不错&#xff0c;并且您按照我们的教程分析出来不错的结果发了文章记得告知我们&…

Linux 中断子系统(七):注册中断

Linux 注册中断的 API request_irq():不使用中断线程化request_threaded_irq():使用中断线程化中断线程化 为什么需要将中断下半部处理线程化,原因如下: 中断具有最高优先级,有中断发生时,会抢占进程,导致实时任务不能及时处理。中断上下文总是可以抢占进程上下文,这…

【PyTorch】教程:学习基础知识-(3) Datasets-DataLoader

Dataset & DataLoader PyTorch 提供了两个数据处理的基本方法&#xff1a;torch.utils.data.DataLoader torch.utils.data.Dataset 允许使用预加载的数据集以及自己的数据。 Dataset 存储样本及其对应的标签&#xff0c; DataLoader 在 Dataset 基础上封装了一个可迭代的对…

Python文本颜色设置

Python文本颜色设置实现过程&#xff1a;书写格式&#xff1a;数值表示的参数含义&#xff1a;常见开头格式&#xff1a;实例&#xff1a;实现过程&#xff1a; 终端的字符颜色是用转义序列控制的&#xff0c;是文本模式下的系统显示功能&#xff0c;和具体的语言无关。 转义序…

Acwing4699. 如此编码

某次测验后&#xff0c;顿顿老师在黑板上留下了一串数字 23333 便飘然而去。 凝望着这个神秘数字&#xff0c;小 P 同学不禁陷入了沉思…… 已知某次测验包含 nn 道单项选择题&#xff0c;其中第 i 题&#xff08;1≤i≤n&#xff09;有 ai 个选项&#xff0c;正确选项为 bi&…

CAS And Atomic

CAS(Compare And Swap 比较并交换)&#xff0c;通常指的是这样一种原子操作&#xff1a;针对一个变量&#xff0c;首先比较它的内存值与某个期望值是否相同&#xff0c;如果相同&#xff0c;就给它赋一个新值,底层是能保证cas是原子性的CAS的应用 在Java 中&#xff0c;CAS 操作…

Android开发-AS学习(三)(布局)

相关文章链接&#xff1a;Android开发-AS学习&#xff08;一&#xff09;&#xff08;控件&#xff09;Android开发-AS学习&#xff08;二&#xff09;(控件&#xff09;Android开发应用案例——简易计算器&#xff08;附完整源码&#xff09;二、布局2.1 Linearyout常见属性说…

测试NGINX和uwsgi.ini设置

1.uwsgi修改测试 将服务器升级到16核16G配置后&#xff0c;我将uwsgi.ini中的部分参数调整如下&#xff1a; processes 32 threads 16 结果是导致内存暴满&#xff0c;然后直接服务器都无法连接&#xff0c;导致服务器卡死。之前有博客说processes处理器*2&#xff0c;结果…

【阶段三】Python机器学习26篇:机器学习项目实战:LightGBM回归模型

本篇的思维导图: 项目实战(LightGBM回归模型) 项目背景 为促进产品的销售,厂商经常会通过多个渠道投放广告。本案例将根据某公司在电视、广播和报纸上的广告投放数据预测广告收益,作为公司制定广告策略的重要参考依据。 本项目应用LightGBM回归算法进行项目实战,整…

Nginx入门

介绍&#xff1a; 下载和安装&#xff1a; 安装过程&#xff1a; 1、因为nginx是由c语言编写的&#xff0c;所以需要下载gcc进行编译 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel 2、下载nginx安装包 wget https://nginx.org/download/nginx-1.16.1.ta…

【Java基础知识 1】第一个Java程序(Java的第一步)

本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; 编写一个Java程序 第一个Java程序非常简单&#xff0c;代码如下&#xff1a; public class Java01_HelloWorld {public static void main(String[] agrs){System.out.println("欢迎来到Java进阶之路&#x…

蓝桥杯 stm32 按键点灯 CubeMX

注&#xff1a;我们使用的是 HAL 库 文章目录前言一、按键 原理图&#xff1a;二、按键CubeMX配置:三、代码讲解1. 读按键&#xff1a;&#xff08; 三行代码&#xff09;2.按键消抖&#xff1a;3&#xff0c;按键点灯&#xff1a;总结实验效果&#xff1a;前言 一、按键 原理…

基于yolov5-v7.0开发构建银行卡号实例分割检测识别分析系统

在之前的文章中我们已经做了很多基于yolov5完成实例分割的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《基于YOLOv5-v7.0的药片污染、缺损裂痕实例分割检测识别分析系统》《基于yolov5-v7.0开发构建裸土实例分割检测识别模型》《基于yolov5-v7.0开发实践实例分割模…

CSDN第24期周赛(记录一下)

▶ 爱要坦荡荡 (163.com) 每一道题都有思路&#xff0c;可是只有一道Accepted100%&#xff0c;一道很简单的50%&#xff0c;一道输出错误10%并报错Segmentation Fault&#xff0c;一道字符串有思路但是没时间了 一&#xff0c;蛇皮矩阵 Accepted 10% 报错Segmentation Fault…

2、矩阵介绍

目录 一、矩阵的构造 二、矩阵大小及结构的改变 三、矩阵下标的引用 1.矩阵下标访问单个矩阵元 2.线性引用矩阵元 3.访问多个矩阵元素 四、矩阵信息的提取 1.矩阵结构 2.矩阵大小 3.矩阵的数据类型 一、矩阵的构造 矩阵的构建方式有两种&#xff0c;一种与单元数组相…

【寒假每日一题】DAY.7 有序序列判断

牛客网例题&#xff1a;点我做题 【❤️温馨提示】先做题&#xff0c;再看讲解效果更佳哟 描述 输入一个整数序列&#xff0c;判断是否是有序序列&#xff0c;有序&#xff0c;指序列中的整数从小到大排序 或者从大到小排序(相同元素也视为有序)。输入描述&#xff1a; 第一行…

【C++】stack、queue的模拟实现及deque介绍

一、stack 1. 以vector作为底层容器 从栈的接口中可以看出&#xff0c;栈实际是一种特殊的vector&#xff0c;因此使用vector完全可以模拟实现stack。 由于stack的所有工作是底层容器完成的&#xff0c;而这种具有“修改某物接口&#xff0c;形成另一种风貌”的性质&#xf…

Dubbo学习

文章目录1.概念1.1 Dubbo特性1.2 设计架构2.快速开始2.1需求假设2.2.工程架构2.3 创建模块2.3.1 gmall-interface—公共接口层2.3.2 gmall-user—用户模块2.3.3 gmall-order-web—订单模块2.3.4 测试结果2.3.5 使用Dubbo改造2.3.6 注解版3.监控中心4.整合SpringBoot5.Dubbo配置…

高性能网络设计专栏-网络编程

以下是在零声教育的听课记录。 如有侵权&#xff0c;请联系我删除。 链接&#xff1a;零声教育官网 一、网络io与select&#xff0c;poll。epoll 网络IO &#xff0c;会涉及到两个系统对象 一个是 用户空间 调用 IO 的进程或者线程&#xff0c;另一个是 内核空间的 内核系统&a…

K_A11_007 基于STM32等单片机驱动K型热电偶( MAX6675) 串口与OLED0.96双显示

[TOC](K_A11_007 基于STM32等单片机驱动K型热电偶( MAX6675) 串口与OLED0.96双显示) 一、资源说明 单片机型号测试条件模块名称代码功能STC89C52RC晶振11.0592MK型热电偶( MAX6675) 模块STC89C52RC驱动K型热电偶( MAX6675)模块串口与OLED0.96双显示STM32F103C8T6晶振8M/系统时…