左神算法之中级提升班(8)

news/2024/5/9 13:33:11

目录

【案例1】

【题目描述】

 【思路解析】

【代码实现】

【案例2】

【题目描述】

 【思路解析】

【代码实现】

【案例3】

【题目描述】

【思路解析】

【案例4】

【题目描述】

【思路解析】

 【代码实现】

【案例5】

【题目描述】

【子序列概念】

【思路解析1 经典方法 时间复杂度为O(N^2)】

【代码实现1】

【思路解析2 优化技巧之构建单调性  时间复杂度为O(N*logN)】

【代码实现2】

【案例6】

【题目描述】

 【思路解析】

【代码实现】


【案例1】

【题目描述】

 【思路解析】

一个简单的贪心策略。

对于字符串str,任意一个位置上只能为字符'.'或者'X'。则对于任意i位置有两种情况。

(1)i位置上为字符'X',此位置不需要放路灯

(2)i位置上为字符'.',此位置放灯则需要根据i+1位置来判断,如果i+1位置是‘X',则i位置放灯,如果i+1位置是’.',则i+1位置放灯。

【代码实现】

import java.util.Scanner;/*** @ProjectName: study3* @FileName: Ex1* @author:HWJ* @Data: 2023/7/30 9:27*/
public class Ex1 {public static void main(String[] args) {Scanner input = new Scanner(System.in);int t = input.nextInt();for (int i = 0; i < t; i++) {int n = input.nextInt();String s = input.nextLine();System.out.println(minLight(s, n));}}public static int minLight(String s, int length) {if (s == null || length == 0) {return 0;}char[] str = s.toCharArray();int i = 0;int count = 0;while (i < length) {if (str[i] == 'X') {i++;} else {count++;// 加入条件(i + 1) < length 来防止越界if ((i + 1) < length && str[i + 1] == 'X') {i += 2;} else if ((i + 1) < length && str[i + 1] == '.') {i += 3;}else { // 如果不是以上两种情况 就说明 i+1 == length,说明已经遍历完成,直接退出循环break;}}}return count;}
}

【案例2】

【题目描述】

 【思路解析】

我们已知先序数组int[ ] pre,中序数组int[ ] in,我们需要得到后序数组int[ ] pos,先序数组和中序数组和后序数组长度相同,然后先序数组对应二叉树的顺序为头左右,中序数组对应二叉树的顺序为左头右,后序数组对应二叉树的顺序为左右头,所以我们可以通过先序数组的第一个位置确定整棵树的头,然后找出它在中序数组的位置,此位置左边就是整棵树最大的左子树,右边就是整棵树最大的右子树,然后在先序数组中头位置的右边同样多的数也是左子树,然后剩下的数为右子树,这样又可以继续递归确定子树的位置然后将其填入后序数组中。填入时,头位置填入在当前填充后序数组位置中最后一个,然后填入右子树,然后填入左子树,填入顺序为从右至左。

【代码实现】

代码中在中序数组中寻找头的位置使用的是遍历的方式,我们可以对中序数组中每个位置上的值做一个哈希表来对应,这样下次寻找头的时候直接访问哈希表即可,创建哈希表只需要做一次遍历,所以这是一个优化搜索的方法。

import java.util.Arrays;/*** @ProjectName: study3* @FileName: Ex2* @author:HWJ* @Data: 2023/7/30 10:16*/
public class Ex2 {public static void main(String[] args) {int[] pre = {1,2,4,5,3,6,7};int[] in = {4,2,5,1,6,3,7};int[] pos = getPosArray(pre, in);System.out.println(Arrays.toString(pos));}public static int[] getPosArray(int[] pre,int[] in){int N = pre.length;int[] pos = new int[N];process(pre, 0, N - 1, in, 0, N - 1, pos, 0, N - 1);return pos;}public static void process(int[] pre, int prei, int prej,int[] in, int ini, int inj,int[] pos, int posi, int posj){if (prei > prej){return;}pos[posj] = pre[prei];int find = ini;for (; find < inj; find++) {if (in[find] == pre[prei]){break;}}process(pre, prei + 1 + find - ini, prej, in, find + 1, inj, pos, posj - (find - ini), posj - 1);process(pre, prei + 1, prei + find - ini, in, ini, find - 1, pos, posi, posi - 1 + (find - ini));}
}

【案例3】

【题目描述】

将一个数字用中文表示出来,表示规则需要满足中国人的读数习惯。

经考查 15中国人习惯读十五,215习惯读二百一十五(个别省份读两百一十五),1017习惯读一千零十七,1215习惯读一千二百一十五,所以十位前读不读1,取决于有没有百位。

【思路解析】

 纯coding问题,但是有一个策略,可以先完成1-10的发言,再完成1-99,在完成1-999,后面依次累加,完成全部。

【案例4】

【题目描述】

【思路解析】

如果使用遍历的话完全能得到个数,但时间复杂度为O(N),所以我们需要利用完全二叉树的特性来进行优化,时间复杂度可以达到O((logN)^2)。

 【代码实现】

/*** @ProjectName: study3* @FileName: Ex4* @author:HWJ* @Data: 2023/7/30 11:17*/
public class Ex4 {public static void main(String[] args) {}public static class Node {public int value;public Node left;public Node right;public Node(int value) {this.value = value;}}// 请保证以head为头的树是一颗完全二叉树。public static int nodeNum(Node head) {if (head == null) {return 0;}return bs(head, 1, mostLeftLevel(head, 1));}// level 表示node节点所在层数, h表示整棵树的深度public static int bs(Node node, int level, int h) {if (level == h) {return 1;}if (mostLeftLevel(node.right, level + 1) == h) {// 如果mostLeftLevel(node.right, level + 1) == h,即右子树的最左节点到了h层说明左子树一定是一个满二叉树。// 否则说明右子树是一个满二叉树。return (1 << (h - level)) + bs(node.right, level + 1, h);} else {return (1 << (h - level - 1)) + bs(node.left, level + 1, h);}}// 求出此节点在这棵树上的最左节点的层数// L表示node在的层数// 以node为节点的整棵树应该满足完全二叉树的定义public static int mostLeftLevel(Node node, int L) {while (node.left != null) {L++;node = node.left;}return L;}
}

【案例5】

【题目描述】

【子序列概念】

子序列是指一个序列中任意选取若干个元素(可以是相邻的元素,也可以是不相邻的元素)组成的序列。这些元素的原先相对顺序保持不变。例如,对于序列 [1, 2, 3, 4],其子序列可以是 [1, 2, 3]、[1, 4]、[2, 4]、[1, 3, 4] 等等。在算法和数据结构中,子序列广泛用于字符串匹配、最长子序列等问题的求解。

【思路解析1 经典方法 时间复杂度为O(N^2)】

生成一个与数组arr等长的数组dp,dp[i]的含义为以arr[i[为结尾的子序列最长长度为多少。这样对于任意位置i,它前面的位置已经形成了它的最长递增子序列,然后我们以i位置的数字结尾,我们只需要找到0 --- i-1位置上小于i位置数字的最优解作为倒数第二个数字即可(如果找不到这样的第二个数字,这dp[i]填充1),这样就可以完成对dp数组的填充。然后找出dp数组中最大的那个,我们便得到了最长递增子序列的长度。

【代码实现1】

/*** @ProjectName: study3* @FileName: Ex5* @author:HWJ* @Data: 2023/7/30 12:58*/
public class Ex5 {public static void main(String[] args) {int[] arr = {6, 1, 5, 2, 7, 3, 4};System.out.println(getMaxSub(arr));}public static int getMaxSub(int[] arr) {int N = arr.length;int[] dp = new int[N];for (int i = 0; i < N; i++) {dp[i] = 1; //初始化为1,不管后面是否能找到,都能得到正确的dp结果for (int j = i - 1; j >= 0; j--) {if (arr[i] > arr[j]) { // 找到0 --- i-1位置上小于i位置数字的最优解作为倒数第二个数字dp[i] = Math.max(dp[i], dp[j] + 1);}}}int max = dp[0];for (int i = 1; i < N; i++) {max = Math.max(max, dp[i]);}return max;}
}

【思路解析2 优化技巧之构建单调性  时间复杂度为O(N*logN)】

构建一个等长的ends数组,刚开始里面数据全是无效区域,然后遍历arr数组每个数字,然后在ends数字的有效区域中找到大于这个数字的最左位置,然后更新这个位置上的数字,如果找不到这个数字,则扩充有效区域,然后将这个数字更新到有效区域上,因为这个数组满足单调性,所以在ends数组遍历时可以使用二分法,使遍历的时间复杂度为O(logN)。然后确定了这个数字的在ends上的所在位置后如果该位置假设为i位置,则以它为结尾的最长递增子序列的长度为i+1。

但是如果我们只需要得到最长递增子序列的长度,而不需要知道以arr每个数字结尾的最长递增子序列的长度,我们便可以不再构造dp数组,而是将ends的有效区域长度作为最优解返回。

即代码2的返回修改为 return right + 1;  

【代码实现2】

/*** @ProjectName: study3* @FileName: Ex6* @author:HWJ* @Data: 2023/7/30 13:15*/
public class Ex6 {public static void main(String[] args) {int[] arr = {6, 1, 5, 2, 7, 3, 4};System.out.println(getMaxSub(arr));}public static int getMaxSub(int[] arr) {int N = arr.length;int[] dp = new int[N];int[] ends = new int[N];int left = 0;int right = 0;ends[0] = arr[0];dp[0] = 1;for (int i = 1; i < N; i++) {int index = getIndex(ends, left, right, arr[i]);if (index == -1){ends[++right] = arr[i];dp[i] = right + 1;}else {ends[index] = arr[i];dp[i] = index + 1;}}int max = Integer.MIN_VALUE;for (int i = 0; i < N; i++) {max = Math.max(dp[i], max);}return max;}// 这里的left和right与上面的left和right同义,代表ends数组的有效区域,范围为[left,right]// 返回ends数组中,大于num的最左数字的索引// 如果返回的索引为-1,则没有找到比num大的数字,则需要扩充ends数组的有效区域,然后更新数组,否则直接根据索引进行更新public static int getIndex(int[] ends, int left, int right, int num){int index = -1;while(left <= right){int mid = (left + right) / 2;if (ends[mid] > num){right = mid - 1;index = mid;}else {left = mid + 1;}}return index;}
}

【案例6】

【题目描述】

 【思路解析】

如果n=13,则这个数字为12345678910111213,然后他能不能被3整除可以转化为(1+2+3+4+5+6+7+8+9+1+0+1+1+1+2+1+3)能不能被3整除,然后10能不能被3整除又可以转化为1+0能不能被3整除,所以我们可以将(1+2+3+4+5+6+7+8+9+1+0+1+1+1+2+1+3)这里的数字作同语替换改为(1+2+3+4+5+6+7+8+9+10+11+12+13),这就可以转为 ((n * (n+1))/2)%3,然后防止((n * (n+1))/2)过大,所以使用long来存放

【代码实现】

import java.util.Scanner;/*** @ProjectName: study3* @FileName: Ex7* @author:HWJ* @Data: 2023/7/30 14:00*/
public class Ex7 {public static void main(String[] args) {Scanner input = new Scanner(System.in);int l =input.nextInt();int r = input.nextInt();int count = 0;for (int i = l; i <= r; i++) {long s = ((long) (i + 1) * i) / 2;if (s % 3 == 0){count++;}}System.out.println(count);}}

 


http://www.mrgr.cn/p/81778230

相关文章

[NLP]LLaMA与LLamMA2解读

摘要 Meta最近提出了LLaMA(开放和高效的基础语言模型)模型参数包括从7B到65B等多个版本。最值得注意的是&#xff0c;LLaMA-13B的性能优于GPT-3&#xff0c;而体积却小了10倍以上&#xff0c;LLaMA-65B与Chinchilla-70B和PaLM-540B具有竞争性。 一、引言 一般而言&#xff0…

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

020 - STM32学习笔记 - Fatfs文件系统&#xff08;二&#xff09; - 移植与测试 上节学习了FatFs文件系统的相关知识&#xff0c;这节内容继续学习在STM32上如何移植FatFs文件系统&#xff0c;并且实现文件的创建、读、写与删除等功能。各位看官觉得还行的话点点赞&#xff0c…

Python时间处理:探索time模块

日常工作中&#xff0c;经常涉及到一些时间的转换操作&#xff0c;比如某些业务针对时间的操作要转成不同的时区&#xff0c;有的要转换格式入库&#xff0c;有的需要跟时间对比等等&#xff0c;接下来我们一起来看一下python里面是怎么去处理时间的。 time模块简单介绍 Python…

几百本常用计算机开发语言电子书链接

GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍&#xff0c;没准你想找的书就在这里呢&#xff0c;包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列&#xff08;常用深度学习框架TensorFlow、pytorch、keras。NLP、…

[STL]详解list模拟实现

[STL]list模拟实现 文章目录 [STL]list模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1迭代器区间构造函数拷贝构造函数赋值运算符重载析构函数 4. 迭代器及相关函数迭代器整体结构总览迭代器的模拟实现begin函数和end函数begin函数和end函数const版本 5. 数据…

心法利器[93] | 谈校招:技术面

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2022年新一版的文章合集已经发布&#xff0c;累计已经60w字了&#xff0c;获取方式看这里&…

eda、gnm、anm究竟是个啥?

安装prody pip install prody -i https://pypi.tuna.tsinghua.edu.cn/simpleeda、anm、gnm eda(essential dynamics analysis) 另一个名字PCA(Principal Component Analysis) 或 NMA(Normal Mode Analysis)。 eda分析可以帮助人们理解生物大分子基本的运动模式和构象变化。…

【Linux】自动化构建工具-make/Makefile详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么

目录 Chat GPT是什么 初学者怎么使用Chat GPT 使用Chat GPT需要注意什么 一些简单的prompt示例 Chat GPT是什么 Chat GPT是由OpenAI开发的一种大型语言模型&#xff0c;它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构。GPT是一种基于深度学习的…

模电基础知识学习笔记

文章目录&#xff1a; 一&#xff1a;基本元器件介绍 1.二极管 1.1 普通二极管特性测试 1.2 稳压二极管测试 1.3 整流二极管 1.4 开关二极管 2.电容 3.三极管(电流控制) 3.1 介绍 3.2 类型&#xff08;PNP、NPN&#xff09; 3.3 三种工作状态:放大状态、截止状态…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现筛选框:支持下拉搜索+下拉多选+表字典(支持条件查询)功能

JeecgBoot(ant-design-vue)实现筛选框&#xff1a;支持下拉搜索下拉多选表字典(支持条件查询)功能 JSearchMultiSelectTag.vue源文件 一、需求介绍 在使用JeectBoot(ant-design-vue)设计表单时&#xff0c;需要实现下拉搜索下拉多选表字典(支持条件查询)。 但是系统目前有两…

Vue3 Vite electron 开发桌面程序

Electron是一个跨平台的桌面应用程序开发框架&#xff0c;它允许开发人员使用Web技术&#xff08;如HTML、CSS和JavaScript&#xff09;构建桌面应用程序&#xff0c;这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…

机器学习实战:Python基于EM期望最大化进行参数估计(十五)

文章目录 1. 前言1.1 EM的介绍1.2 EM的应用场景 2. 高斯混合模型估计2.1 导入函数2.2 创建数据2.3 初始化2.4 Expectation Step2.5 Maximization step2.6 循环迭代可视化 3. 多维情况4. 讨论 1. 前言 1.1 EM的介绍 &#xff08;Expectation-Maximization&#xff0c;EM&#…

程序设计 算法基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

知识点&#xff1a;简单了解K210芯片 2018年9月6日,嘉楠科技推出自主设计研发的全球首款基于RISC-V的量产商用边缘智能计算芯片勘智K210。该芯片依托于完全自主研发的AI神经网络加速器KPU,具备自主IP、视听兼具与可编程能力三大特点,能够充分适配多个业务场景的需求。作为嘉楠科…

QGIS3.28的二次开发一:编译工程

环境&#xff1a;VS2019OSGeo4WCMake_3.26Cygwin64QGIS_3.28 注意&#xff1a;一定要按照步骤顺序来&#xff01; 一、配置环境 &#xff08;一&#xff09;VS2019 VS2019下载链接https://my.visualstudio.com/Downloads?qvisual%20studio%202019&wt.mc_ido~msft~vsco…

WAIC2023:图像内容安全黑科技助力可信AI发展

目录 0 写在前面1 AI图像篡改检测2 生成式图像鉴别2.1 主干特征提取通道2.2 注意力模块2.3 纹理增强模块 3 OCR对抗攻击4 助力可信AI向善发展总结 0 写在前面 2023世界人工智能大会(WAIC)已圆满结束&#xff0c;恰逢全球大模型和生成式人工智能蓬勃兴起之时&#xff0c;今年参…

【沐风老师】归纳总结50个3dMax常用的方法和技巧

​在日常工作中&#xff0c;我们总能总结出一些方法和技巧&#xff0c;用以在今后的工作中提高工作效率。下面是50个3dMax最常见的方法和技巧&#xff0c;这些方法和技巧已经成为众多3dMax用户日常工作流程中不可或缺的一部分。 1.使用“重命名对象”工具可以同时重命名多个对象…

【Chat GPT】用 ChatGPT 运行 Python

前言 ChatGPT 是一个基于 GPT-2 模型的人工智能聊天机器人&#xff0c;它可以进行智能对话&#xff0c;同时还支持 Python 编程语言的运行&#xff0c;可以通过 API 接口进行调用。本文将介绍如何使用 ChatGPT 运行 Python 代码&#xff0c;并提供一个实际代码案例。 ChatGPT …