- 博客(46)
- 收藏
- 关注
原创 算法练习第29天|1005.K次取反后最大化的数组和
贪心的思路:尽可能将绝对值比较大的负数取反成正数,正数保持不变。所以需要按照绝对值的大小对数组先进性依次排序。然后依次遍历元素,若为负数且k不为0,则将该负数取反。最后若k还有剩余,全作用到绝对值最小的最后那个元素上,这样能保证数组和最大化。选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2]。选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。选择下标 1 ,nums 变为 [4,-2,3]。以这种方式修改数组后,返回数组。可以多次选择同一个下标。
2024-07-09 21:39:21
272
原创 算法练习第28天|122.买卖股票的最佳时机 II、55.跳跃游戏
因为要获取最大的利润,所以贪心的思想就是,在遍历所得到的利润时,如果利润为正,则可以买入一次第二天再卖出,准备下一轮的买入。由于第四天的价格为10,所以我第三天以5的价格买入,第四天以10的价格卖出,又获利了5元。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
2024-07-06 23:29:42
868
原创 算法练习第27天|455.分发饼干、376摆动序列、53. 最大子序和
从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。以数组nums = [-2,1,-3,4,-1,2,1,-5,4]为例,如果 -2,1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。
2024-07-05 11:50:34
391
原创 C++设计模式|结构型 代理模式
代理模式是一种结构型设计模式,用于控制对其他对象的访问。在代理模式中,。比如说有一个文件加载的场景,为了避免直接访问“文件”对象,我们可以新增一个代理对象,代理对象中有一个对“文件对象”的,在代理对象的load方法中,可以在访问真实的文件对象之前进行一些操作,比如权限检查,然后调用真实文件对象的load方法,最后在访问真实对象后进行其他操作,比如记录访问日志。
2024-06-02 21:08:37
858
原创 C++设计模式|结构型 适配器模式
可以将⼀个类的接⼝转换成客户希望的另⼀个接⼝,主要⽬的是 充当两个不同接⼝之间的桥梁,使得原本接⼝不兼容的类能够⼀起⼯作。2. 适配器模式的组成(1)接口类,给客户端调用;(2)被适配者类;(3)适配器类。3.适配器模式的分类适配器模式一般分为类适配器模式和对象适配器模式。(1):适配器类通过继承适配者类(多重继承),达到适配目的,部分语言可能不支持多重继承(如C#)。(2):适配器类中存放适配者类的实例对象,调用它来达到适配目的,该模式较常用。下面的题目我们使用第二种类型来进行求解。
2024-05-19 17:26:39
829
原创 算法练习第23天|131.分割回文串、93.复原IP地址
回溯函数除了参数除了需要字符串,还用到了老朋友result和path(也可以去掉,因为是全局的)。判断回文的函数有三个参数,字符串本身s,字符串起始位置start以及字符串末尾位置(最后一个字符的位置)。回溯第三步就是提取未探索区域的子串,然后判断子串是否为回文串 ,如果是,path记录,然后未探索区域进一步缩小,进行递归,回溯。我们在前面的文章中讲到,如果从一个集合中取组合就需要使用startIndex(见这篇博文39题的思路分析部分)。其实本题的切割问题也可以看作前面题目中从集合中取元素的问题。
2024-05-18 19:22:25
607
原创 C++设计模式|创建型 5.原型模式
原型模式⼀种创建型设计模式,该模式的核⼼思想是基于现有的对象创建新的对象,⽽不是从头开始创建。在原型模式中,通常有⼀个原型对象,它被⽤作创建新对象的模板。新对象通过复制原型对象的属性和状态来创 建,⽽⽆需知道具体的创建细节。2.为什么要使用原型模式?如果一个对象的创建过程比较复杂时(比如需要经过一系列的计算和资源消耗),那每次创建该对象都需要消耗资源,而通过原型模式就可以复制现有的一个对象来迅速创建/克隆一个新对象,不必关心具体的创建细节,可以降低对象创建的成本。
2024-05-14 21:02:15
498
原创 算法练习第21天|216.组合总和|||、17.电话号码的字母组合
一般来说,回溯函数的返回值类型为void,至于参数,为了表达方便,我们定义了目标和targetSum(即题目中的n)、k、遍历到当前路径的和sum、以及每一层回溯的开始索引startIndex。index表示遍历到了digits的第几个数字,其初始值为0,遍历过一个数字后就会+1,那么当index等于digits.size()时,表明遍历完毕。在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。给出数字到字母的映射如下(与电话按键相同)。
2024-05-14 16:32:22
875
原创 C++设计模式|创建型 4.建造者模式
建造者模式(也被成为生成器模式),是一种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,而建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义一个抽象的接口。具体的构建过程由实现了这些接口的具体建造者类来完成。同时有一个指导者类负责协调建造者的工作,按照一定的顺序或逻辑来执行构建步骤,最终生成产品。举个例子,假如我们要创建一个计算机对象,计算机由很多组件组成,例如 CPU、内存、硬盘、显卡等。每个组件可能有不同的型号、配置和制造,这个时候计算机就可以被视为一个复杂对象,构建过程相
2024-04-19 18:03:53
942
原创 算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。其本质是穷举,穷举所有可能,然后选出我们想要的答案。2.为什么要有回溯算法?那么既然回溯法并不高效为什么还要用它呢?因为有的问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式棋盘问题:N皇后,解数独等等。
2024-04-18 21:40:15
1128
原创 C++设计模式|创建型 3.抽象工厂模式
在上一篇文章中介绍了,每个具体工厂负责生产一个专门的产品,其代码扩展性很好,这篇文章将介绍抽象工厂模式。
2024-04-17 20:27:48
976
原创 算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度==二叉树的层数==根节点的深度==根节点的高度==第二层节点的最大高度+1。二叉树某个节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树某个节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
2024-04-16 20:11:22
832
原创 C++设计模式|创建型 2.工厂模式
简单工厂的思想中只有一个工厂类,用于创建所有的产品,如果需要添加新的产品,就需要修改工厂类的代码。而工厂模式引入了抽象工厂和具体工厂的概念,每个具体工厂只负责创建一个具体产品,添加新产品时只需要添加新的工厂类,支持扩展,复合开闭原则。一个接口,包含一个抽象的工厂方法,该方法用于创建产品对象。具体工厂:实现抽象工厂接口,创建具体的产品。抽象产品类:定义产品的接口。具体产品类:实现抽象产品接口,是工厂创建的对象。工厂模式的示意图如下图所示,实际的生产系统所管理的是对应的工厂,工厂负责产品的生产。
2024-04-16 19:19:06
1134
原创 算法练习第16天|101. 对称二叉树
力扣链接题目描述:给你一个二叉树的根节点root, 检查它是否轴对称。truefalse思路分析:对于二叉树是否对称,要比较的是是不是相互翻转的,而不是比较左右子节点。所以在递归遍历的过程中,。要比较子树的外侧与内侧。
2024-04-12 22:37:36
360
原创 C++设计模式|创建型 1.单例模式
单例模式的的核⼼思想在创建类对象的时候保证⼀个类只有⼀个实例,并提供⼀个全局访问点来访问这个实例。只有⼀个实例的意思是,在整个应⽤程序中,只存在该类的⼀个实例对象,⽽不是创建多个相同类型的对象。全局访问点的意思是,为了让其他类能够获取到这个唯⼀实例,该类提供了⼀个全局访问点(通常是⼀个静态⽅法),通过这个⽅法就能获得实例。
2024-04-12 17:12:26
1450
原创 C++设计模式|0.前言
简答来说,设计模式就是一套好用的代码经验总结,也就是怎么写好代码的方法论。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。
2024-04-12 14:44:31
437
原创 算法练习第15天|226.翻转二叉树
力扣链接题目描述:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。[2,3,1]root = [][]思路分析:翻转二叉树,其实就把每一个节点的左右孩子交换一下就可以了。注意,是的左右子节点。这就可以用到前面所将的二叉树递归遍历和层序遍历。下面分别使用前序递归,后序递归和层序遍历来实现。
2024-04-11 19:31:39
340
原创 算法练习第14天|102.二叉树的层序遍历
层序遍历可以借助单向队列来实现。队列先进先出的特性,与按层次进行元素的先后遍历刚好思想统一。二叉树通过指针来实现树的构建,所以队列里面存的应该是指向节点的指针,而且遍历开始时存放的应该是。在记录完根节点对应的元素后,应该将根节点对应的左右子节点的指针入队(为下一层遍历做准备),同时将根节点指针出队(已经记录过了)。层序遍历与前面讲的递归实现二叉树的遍历属于不同思想。此外,对于较深的层,其节点数可能不唯一,这时候就需要在。(即逐层地,从左到右访问所有节点)。,而前面讲的递归遍历属于。,接着该节点的指针出队。
2024-04-11 14:34:27
314
原创 算法练习第12天|● 239. 滑动窗口最大值● 347.前 K 个高频元素
其中 push(int val) 表示val入队,它的规则是:如果val前面的元素比val小,那么就将这些数通过pop_back弹出,直到遇到比val大的数停止或队列为空停止。所以为了更加方面的对多余元素进行剔除,单调队列在用STL容器中的双端deque进行实现,因为deque支持在队列两端进行入队、出队操作。窗口滑动之后,3不在是窗口内的数,所以需要使用pop_front将单调队列中的3弹出。如下图所示,单调队列的入队规则是如果入队的元素前面有比自己小的数,这些数全部被。你只可以看到在滑动窗口内的。
2024-04-08 18:32:32
694
原创 算法练习第13天|递归实现 144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历
二叉树的存储方式:链式存储和顺序存储。链式存储用指针,顺序存储用数组。其结构如下图所示。
2024-01-23 17:56:29
1971
原创 算法练习第11天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
题目描述:给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。s = "()"truetrues = "(]"false思路分析:使用栈 来实现左右括号的配对,遍历输入字符串:1.若为左括号则入栈2.若为右括号,则先看看栈是否为空,若为空,表明前面没有和该右括号匹配的左括号,return false;若不为空,则拿栈顶元素和该右括号判断是否为一对,若为一对,则出栈,遍历下一个字符。遍历完了之后,看一下栈是否为空。
2024-01-22 21:57:51
1014
原创 算法第10天|232.用栈实现队列225. 用队列实现栈
我们用c++容器中的单向queue来作为两个队列的基本实现,如果是双端队列deque没啥意义,因为两端都能出队入队,一端进,另一端出,直接就能当栈使用。queue的常用接口如下:构造函数://queue采用模板类实现,queue对象的默认构造形式//拷贝构造函数赋值操作://重载等号操作符数据存取:push(elem);//往队尾添加元素,入队操作,无返回值。pop();//从队头移除第一个元素,出队操作,无返回值。出队的元素不会被返回back();//返回最后一个元素。
2024-01-22 20:22:15
1794
原创 算法练习第7天|344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须、使用 O(1) 的额外空间解决这一问题。
2024-01-17 22:24:48
1342
原创 算法练习第6天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
题目描述:给你四个整数数组nums1nums2nums3和nums4,数组长度都是n,请你计算有多少个元组。
2024-01-16 20:09:38
1797
1
原创 算法训练第5天|哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
哈希表是根据的值而直接进行访问的数据结构。
2024-01-15 20:21:30
1851
1
原创 算法训练第4天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
【代码】算法训练第4天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II。
2024-01-13 18:22:03
1356
1
原创 算法训练第三天|203.移除链表元素 707.设计链表 206.反转链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域,另一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。
2024-01-12 21:57:23
2031
1
原创 算法训练第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
代码中最小长度的初始值没有采用min_len = INT32_MAX,而是采用了nums.size()+1,因为子数组长度最大也就是nums.size()那么大。对于第二圈,13和14为上面的边,13为左闭,14为右开(不包含),因此14算到(14,15)这一条边的左闭,以此类推。,就很容易出问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。这样在走每一条边的时候,避免一会左开右闭,一会左闭右闭,一会又来左闭右开。所以,为了遍历,在所有遍历的边上采用左开右闭原则,即。
2024-01-11 20:46:42
2983
原创 算法训练第一天|数组理论基础,704. 二分查找,27. 移除元素
数组第 i 个元素与第 j 个元素间的内存地址(假设j > i)相差: (j - i)* 元素数据类型字节数。如int arr[],元素数据类型字节数为4;short arr[],元素数据类型字节数为2,以此类推。二维数组的存储顺序是按行来进行的。
2024-01-10 23:07:54
1975
1
原创 Pytorch数据集加载:官方数据集、自定义数据集、非文件数据集
重点讲解官方数据集的加载,自定义数据集的加载,非文件行数据集的加载。干活满满,带你避坑。
2022-06-16 21:43:41
511
1
原创 数据结构最小堆C++实现
#pragma once# include<iostream>using namespace std;int DefaultSize = 10; //定义最小堆默认存储数据的数目//最小堆的头文件,包括类定义及接口的实现。template <class T>class MinHeap{public: MinHeap(int sz = DefaultSize); //构造函数,建立空堆......
2022-05-18 14:02:41
3600
1
原创 数据结构链式队列C++实现
1.链式队列链式队列是基于单链表的存储表示。所以在实现链式队列时使用了和链表一样的结点struct,结点的具体定义放在"Queue.h"的头文件中。链式队列有两个指针front,rear,front为队头指针,指向单链表的第一个结点,rear为队尾指针,指向单链表的最后一个结点,所以出队是删除第一个节点,入队是将新元素的结点插在单链表最后一个结点的后面。结构图如下:本文链式队列对应的单链表没有设计空的头节点,因为头节点也没太大用处。注意,当队列只有一个元素时,front == rear,因.
2022-04-16 00:12:48
2329
原创 数据结构循环队列C++实现
1.队列的概念队列只允许在表的一端插入,另一端删除。允许插入的一端叫做队尾,允许删除的一端叫做对首。队列的特性叫“先进先出”。和栈一样,队列的存储形式也有两种,基于数组的存储表示和基于链表的存储表示。本文先实现基于数组的存储队列,也叫顺序队列。在顺序队列中设置两个指针,front和rear,front指示队头的位置,rear指示队尾的位置(说是指针,实际仍不是c语言的指针*,而是类似下标或索引的作用)。如下图所示:当队列为空时,front=rear=0; 有新元素入队时,先将新元素添加到rea
2022-04-13 15:47:53
2747
原创 数据结构顺序栈C++实现
栈,先入后出,根据存储方式可以分为顺序栈和链式栈。顺序栈的存储基于数组,链式栈的存储基于链表。顺序栈就是以c语言的数组作为内存空间来构成的栈。栈顶指针top不再是c语言的指针类型,而是元素的下标。本文仍然使用模板的方法来实现,因为模板使用的内置数据类型较多,更全面。1. 首先定义一下栈的通用接口,写在 “stack.h” 头文件中,通用接口为纯虚函数,方便顺序栈来继承和重写,以实现C++的多态。 “stack.h” 头文件代码如下:...
2022-04-07 18:08:14
3266
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人