自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 收藏
  • 关注

原创 动态SQL

if标签中test属性的值是true或者false,true则进行拼接,false则反之。加前缀时,改标签可以动态判断,当if里面全部不成立时,where不会加上去。可以自动去掉逗号 “,”,并且添加set。注意test里面用的是and表示并且。第一个if标签中的and可以自动去掉。声明sql片段提高复用性,用的较少。if标签中test属性时必须的。让where字句更加动态智能。

2022-11-27 15:20:05 363 1

原创 Cookie

在HTTP协议中是这样规定的:当浏览器发送请求的时候,会自动携带该path下的cookie数据给服务器。表示只要是这个servlet13项目的请求路径,都会提交这个cookie给服务器。”生成的cookie,如果cookie没有设置path,默认的path是什么?这个路径以及这个路径下的子路径,cookie都会被发送到服务器。浏览器发送cookie给服务器了,服务器中的java程序怎么接收?在java的servlet中,对cookie提供了哪些支持呢?也就是说,以后只要浏览器的请求路径是。

2022-11-24 16:58:19 4662

原创 关于B/S结构系统的会话机制(session机制)

JSP九大内置对象中,有session对象。什么是请求:用户在浏览器上点击了一下,然后页面停下来,可以认为是一次请求。超时销毁------浏览器可能一直没关,但是超时了,session就没了。session机制其实是一种规范,然后不同的语言对这种会话机制都有实现。一个用户对应一个session,在不同的浏览器打开属于不同的用户。session对象最主要的作用是:保存会话状态。为什么需要session对象保存会话状态呢?让jsp的九大内置对象没有session对象。手动销毁-----安全退出按钮。

2022-11-24 16:57:27 466

原创 重定向和转发的区别

转发会出现一个问题,比如有一个Servlet类,完成的是向数据库插入一个数据,插入成功后会跳转到一个新的页面,如果用转发的方式话,在新的页面上刷新浏览器时,会再次插一条数据到数据库当中,转发是一次请求,你在新页面刷新就是重新执行这个请求。而如果用重定向则不会出现该问题。如何选择转发和重定向。

2022-11-24 16:54:49 337

原创 HTTP超文本传输协议

注意:我们以后编写Servlet类时,不会直接继承GenericServlet类,因为我们是B/S结构系统,这种系统是基于HTTP超文本传输协议的,他有一个专门的Servlet类。只有两种情况可以发送POST请求:使用form表单,并且form标签中的method属性值为:post,或者做文件上传,用post。这种协议游走在B和S之间,B和S之间传输数据都要遵循该协议,这样B和S才能解耦合(即B不依赖S,S不依赖B)。HTTP请求协议的具体报文:POST请求。HTTP请求协议的具体报文:GET请求。

2022-11-24 16:52:39 363

原创 贪心-无重叠区间

题目说要移除最小数量的区间是他们不重复,这时候可以想一下怎样拍可以是他们更加散开一点,也就是将右区间从小到大排序,也能够想象到将左区间从小到大排序,他们就更拥挤一些,就靠的更近一些。注意: 可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。因为我们使用了贪心,尽量把右区间小的先挑出来,给后面预留更多空间。要想到直接求重复的是比较困难的,求不重复的会容易很多。给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

2022-09-20 16:22:36 110

原创 贪心-用最少数量的箭引爆气球

在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。因为通过最小有边界能判定是否相连,例如i-1的有边界如果大于i的左边界,则i-1和i号气球相连,这时候再判断i+1号气球是否和前面两个是否相连,是不是要把i+1的左边界跟前面两个气球右边界小的比较,可以画画图理解。思路:大致思路就是一个一个遍历,判断是否挨着,如果没挨着,那么前面的气球要被射,如果挨着了那么持续判断直到重合数量最多再射。

2022-09-19 20:27:41 107

原创 贪心-根据身高重建队列

因为vector的底层是数组,其有两个重要的属性,一个是size,一个是capicity,类似于一个是数组的组长,一个是数组本来的储存空间,如果你要insert或者push_back一个元素,如果储存空间不够,会先拷贝一个数组,该数组的储存空间是原来的两倍,然后再把所有元素拷贝进来,这样就导致了使用动态数组(vector)的效率非常低。请你重新构造并返回输入数组 people 所表示的队列。因为方法二中使用的是list,list的底层使用链表实现的,比vector底层用数组实现的插入删除效率要高的多。

2022-09-18 16:23:39 160

原创 贪心-分发糖果

其实只用记住一点,就是if语句里面有两个值,一个是需要修改的(candyVec[i]),一个是被比较的,那么被比较的一定是要已经修改好的,也就是说不能在动的。如果第二次是从左往右遍历,那么if语句里面的ratingsp[i]和ratings[i+1],前者是需要被修改的,后者是被比较的,但是后者H还没有被确定,也就是说前者如果修改好了,然后就是后者和后后者进行比较,后者就可能被改变,这导致了结果会被影响,所以第二次遍历的顺序要从后往前。那么这样下来,老师至少需要准备多少颗糖果呢?

2022-09-17 21:10:38 102

原创 贪心-加油站

因为如果在你确定了能转一圈的情况下,也就是说加油的总量减去耗油的总量是大于0的。那么在这种情况下,如果[0, j]区间小于零,那么[j+1, end]一定大于零。更加抽象一点就是,a+b>0,如果a

2022-09-17 20:19:45 234

原创 贪心-K次取反后最大化的数组和

注意:后面的if语句的条件是k%2,因为如果是偶数,翻转最后一个数两次相当于没有翻转,所以可以不管,如果是奇数,则只需要翻转一次。所需要注意的是每次翻转的时候不要忘记对Max和temp进行初始化,还有记录所翻转的值。第二次贪心,如果数组中没有负数了,就将绝对值最小的整数翻转过来,产生局部最大值。第一次贪心:如果数组中有负数,则将绝对值大的负数先翻转过来,产生局部最大值。局部最优:每次遍历所有数组求出只翻转一个数所产生的最大值。先进行排序,将绝对值大的放前面,绝对值小的放后面。整体最优:K次翻转产生最大值。

2022-09-17 15:03:55 109

原创 回溯-解数独

算法思想:首先看到这题第一想法就是穷举,但是很明显普通的穷举是无法求出答案的,所以利用回溯的方法,其实这题和n皇后问题很像,但是n皇后是每行只能放一个,而数独要放多个,这时候就想到需要用双重for循环来找到节点,然后n叉树的每一层是对该节点赋值,从1-9选择,所以n叉树中n为9。

2022-09-13 19:50:03 122

原创 回溯-n皇后

算法思想:主干还是回溯的经典模板,n叉树的每一层也就是棋盘的一行,每次都是在这一行的某列进行选取,选取的时候判断是否有效,然后再一行一行的往下递归,直至整个棋盘都遍历并且判断完成。判断就只需要判断在不同列和不同45和135度即可,因为本来就是一行一行往下的,不可能同行。注意棋盘是从[0][0]开始的。

2022-09-13 16:35:59 151

原创 回溯-重新安排行程

【代码】回溯-重新安排行程。

2022-09-12 14:19:57 148

原创 回溯-全排列 II

【代码】回溯-全排列 II。

2022-09-11 13:43:49 139

原创 回溯-全排列

这题也是经典的排列问题,相比于组合问题和切割问题,排列问题就不再需要startIndex了,因为排列每次都是从头开始排列,则不再需要知道到底是从数组的那个地方开始了。然后就是需要定义一个used数组,判断所有元素中有哪些被用过,用过了的就不能在取了。首先得知道排列和组合的区别,排列是有顺序的,例如[1, 2]和[2, 1]是不同的,而对于组合,他们是相同的。回溯的经典题型-排列问题。

2022-09-10 14:39:50 149

原创 回溯-递增子序列

难点:首先这题所给的数组里面会出现相同的元素,这个时候我们第一时间想到去重,但是因为他是求递增子序列,用used数组那个方法的话会改变数组里的元素顺序,所以想到用set集合,set集合有个特点就是里面不会有相同的元素,且默认是以升序排列的。然后就是结果要求path里的元素大于1。还有剪枝的时候在判断递增前,要加上path.size()等于0的时候也允许加入到path,所以我们每次可以把n叉树的一层的索取的数放到这个set里面去,保证了树层去重(利用find函数)。

2022-09-10 14:20:19 225

原创 回溯-子集 II

类似于组合问题里面那个集合里面有重复元素那题一样,只需要进行去重即可,进行树层去重,即在n叉树中同一层不能有相同的,那么怎么判断呢,就是如果这个元素和前一个元素相同,并且,前一个元素used为0,即前面那个元素已经被取过了。

2022-09-09 15:25:16 98

原创 回溯-子集

相较于组合问题和切割问题,子集问题最大的区别在于最终结果取的是n叉树的所有节点,而组合问题和切割问题取的是叶子节点。每次直接先保存结果到结果集中,在通过if判断终止条件,再for循环横向遍历。其实写过组合问题和切割问题后,子集问题相较于简单。回溯的一个提醒-子集问题。

2022-09-08 10:58:20 145

原创 Javascript尚硅谷笔记

【代码】Javascript尚硅谷笔记。

2022-09-07 21:57:38 229

原创 回溯-复原IP地址

难点:怎么判断终止,这里用到的是当打点的数量为3的时候说明已经分段完,然后再对最后一段进行判断是否合法即可。那么怎么想到这个呢,我先开始想法是定义一个字符串,当长度是s的长度加三,则代表终止,但是这样有一点会变麻烦,就是这样写你每次往新字符串里面加东西就比较麻烦,因为你不能每次加一小段字符串加上 ‘.’,所以这个方法是比较方便的。还有就是每次回溯的时候,是i + 2,不是i + 1,因为加上了那个点,也不是startIndex + 2,这个要注意,startIndex只是用来确定分割线的。

2022-09-07 19:09:20 190 2

原创 回溯-分割回文串

算法思想:其实和组合问题非常类似,组合问题的取数其实对应切割问题的切割,切割问题就是在某个地方切割,也就是答案中的i,切割下来的就是startIndex到i这一段,然后递归,再回溯。回溯的一个重要题型--切割问题。

2022-09-07 12:31:08 158

原创 JS字符串知识点

这时候会报错,因为当碰到下一个双引号时,系统会把它前半段当成完整字符串。这时候可以将外面的双引号改为单引号。二、当使用双引号里面还有双引号时。使用双引号和单引号结果是一样的。一、双引号和单引号没区别。对里面的双引号使用转义符。

2022-09-06 22:58:46 90

原创 回溯-数组总和II

重点:used数组很重要,确定了在for循环中,也就是树的横向遍历中可以保证可以知道这个元素是否用过,当然前提是对该数组进行了排序,如果这个元素和前一个元素数值相同,并且used[i - 1]是false,则代表前一个元素在同一树层被使用过,如果used[i - 1] 是true,则代表前一个元素在同一个数枝被使用过,而在这个题目中在同一个数枝使用相同元素是允许的,而同一树层不允许,同一树层,代表出现了相同的组合,同一数枝,代表一个组合出现相同元素。

2022-09-06 22:01:45 90

原创 回溯-组合总和

算法思想:因为可以出现相同的数字,但是不能出现相同的组合,所以可以定义一个index,来确保不会出现相同的组合。那如何保证可以出现相同的数字呢,就是每次递归的时候,也就是调用backTracking函数的时候index不变,for循环遍历的集合起始元素不变。取了一个数,它的子树中可以去这个数,和这个数后面的数,而不能用这个数前面的数。

2022-09-06 17:31:49 73

原创 回溯-电话号码的字母组合

算法思想:首先第一步,也是比较重要的就是,如何完成数字和字母的映射,这里采用的是利用利用一个字符串数组来完成,其实就是通过下标和字符串的对应,因为下标刚好就是数字,所以可以通过字符减去字符0刚好就完成了与数字的对应。然后就是常规的一个回溯过程。

2022-09-06 16:51:03 134

原创 回溯算法-组合

算法思想:首先得知道,组合和排序的区别,组合和无序的,排序是有序的。写回溯类型的题目,心中需要有一棵n叉树,这棵n叉树横向遍历是for循环,纵向遍历是递归,递归多少次是看自己需求并且是一个剪纸的过程。

2022-09-05 15:27:06 276 1

原创 把二叉搜索树转换为累加树

思路:就是以右中左的顺序进行遍历,然后定义一个sum进行累加赋值。

2022-07-12 18:17:03 67

原创 c++命名空间

首先看c++中一个比较常见的指令:该指令中using是编译指令,namespace是命名空间,std是一个标准类库。那么为什么要这条指令呢?因为存在这样一个问题,当你使用两个封装好的产品a,b时,而他们可能都有一个相同的函数C(),然而当你使用这个函数时,你无法确定你是用的是哪一个产品的函数,所以当你使用该指令时,你可以写一个using namespace a;这样你所使用的就是a的C()函数。当然你也可以不写该指令,你可以在调用C()函数时,指明你是用的是a的,这时,调用该函数时你得写a::C(),

2022-07-12 10:44:55 200

原创 将有序数组转换为二叉搜索树

时间复杂度:O(N)思路:主要思路就是二分法,每次递归取数组的中间元素,(注意如果是偶数的时候是取左边还是右边),递归的单层逻辑就是把数组的中间元素当为根节点,然后一层一层的遍历下去。多写一个函数的原因就是使用left和right更好的控制边界。...

2022-07-11 22:40:53 107

原创 (二叉搜索树)修剪二叉搜索树

时间复杂度O(n)思路:递归法还是有一点绕,整体步骤就是先确定好根节点,根节点如果有问题会出现两种情况,一是小于low,此时我们应该从根节点的右儿子中继续寻找合适的根节点,以为一旦根节点小于low,其左子树一定都小于low,第二种情况是大于high,同理,我们应该从其右儿子中去寻找,找好根节点后,然后再去确定其左儿子和右儿子,确定的方法与BST的增添和删除有异曲同工之妙,只是不需要有if条件的限制,因为现在是有方向性的遍历整颗树,而不是有方向性的遍历某一条边。...

2022-07-11 22:18:21 101

原创 删除二叉搜索树中的节点

时间复杂度:O(h)h为树的高度思路:相较于BST的插入操作,删除更为复杂,有五种情况,但是大致框架都是一样,为有返回值的遍历边(用返回值构造树的某条边),所以时间复杂度为O(h)。五种情况如下:(1)没有删除的节点,则遍历到空节点直接返回。(2)找到删除的节点,其左右儿子为空,则直接删除该节点,返回为空。(3)找到删除的节点,其左空右不空,删除该节点,返回右节点(右节点代替了该节点)。(4)找到删除的节点,其左不空右空,删除该节点,返回左节点(同理)。(5)找到删除的节点,左右都不空,将左子树

2022-07-10 14:00:16 384

原创 JPA技术实践(包含分页的代码实现)

list界面add界面edit界面delete界面同时还包含了上一页,下一页,跳转页面,显示页面数,记录数,页面数等等。

2022-07-08 14:42:25 513

原创 二叉搜索树的插入操作

思路:因为是二叉搜索树,递归可以有方向。如何递归,首先确定递归的返回值,明显是树的根节点,然后确定递归的终止条件,很明显当遍历到空节点是终止递归,终止的同时,返回插入的节点值,最终确定单层的递归逻辑,因为底层返回的插入的值,上一层就要接住底层返回的值,所以用到left和right来接住底层的返回值,最终返回root即可。迭代法:.........

2022-07-08 14:24:05 255

原创 二叉搜索树的最近公共祖先

时间复杂度:O(n)思路:因为是二叉搜索树,所以它是有序的,所以不需要进行后序遍历,用回溯的思想,而是可以直接先序遍历,直到找到满足条件的那条边,即找到最近公共祖先,而公共祖先满足的条件就是cur的val在p的val和val之间即可,但是前提条件是从上到下开始遍历,所以用到先序遍历。......

2022-07-08 13:21:44 200

原创 二叉树的最近公共祖先

class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == p || root == q || root == NULL) return root; TreeNode* left = lowestCommonAncestor(root->left, p, q); //左 Tre.

2022-05-30 15:05:39 64

原创 二叉搜索树的众数

首先我们可以先试一下如果他是个普通的二叉树,我们该如何处理这题,我们很容易想到用到map映射,键是搜索树结点的值,值是出现的频率。先把树遍历一遍,把map映射先初始化,然后对map的值进行排序,然后就很容易找到众数,但是unordered_map容器内部是无序的,也没有相关的函数使用,所以把map里的元素通过pair放到vector数组里面去,然后自己定义cmp函数,比较pair元素的second,也就是频率,把这个函数参数放到sort函数里面去,然后取与vector第一个元素频率相同的前几个就行代码如.

2022-05-29 13:55:32 137

原创 验证搜索二叉树

知识点搜索二叉树除了他们结点之间有序外,还有一个很重要的特性,就是中序遍历搜索二叉树时,会发现是一个递增的序列。思路:我们可以利用这个特性对搜索二叉树进行中序遍历,遍历的同时将结果记录在一个数组中,然后对这个数组进行判断看起是否递增。class Solution {private: vector<int> vec; void traversal(TreeNode* root) { if (root == NULL) return; tra.

2022-05-28 10:59:44 104

原创 搜索二叉树

二叉搜索树的特性就是其结点之间的有序性,即根的值大于其左儿子的值,而且小于其右儿子的值。这样导致了我们递归或者迭代的时候需要改一下以前的方法,不然就浪费了其搜索二叉树的特性。方法一:迭代法class Solution {public: TreeNode* searchBST(TreeNode* root, int val) { while (root != NULL) { if (root->val > val) root = root-&.

2022-05-27 09:35:31 45

原创 合并二叉树

方法一:迭代法(层序遍历)class Solution {public: TreeNode* mergeTrees(TreeNode* r1, TreeNode* r2) { if (r1 == nullptr) return r2; if (r2 == nullptr) return r1; queue<TreeNode*> que; que.push(r1); que.push(r2); .

2022-05-26 17:07:22 77

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除