- 博客(114)
- 收藏
- 关注
原创 读spring in action spring 之旅
缺失的第一个正数给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1:输入:nums = [1,2,0]输出:3总结:可以用打标记的方法,首先第一次将数据中小于等于零的数据划分为 n + 1,将在 1<= x <= n的数修改为负数。说到底还是利用空间划分的一种思路进行修改。接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨.
2022-04-25 14:11:44 230
转载 2021-10-23
对于算法题,还是要及时地进行总结和收获,不然,对于核心的知识掌握过几天就忘记了,相当于之前付出的努力都打了水漂,多浪费啊。LRU缓存机制LRU 缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int k
2021-10-23 17:32:32 224
转载 spring一些捞到的东西
spring指令重排和多线程,原来在编写程序的时候要考虑这么多东西,要想清楚每一个代码,每一个线程在哪执行,还有要懂得jvm 的一些优化的。任重而道远啊。单例模式,只允许一个实例的存在,构造函数是私有的,对外提供获取实例的方法。getInstance()单例模式需要注意多线程情况下的程序正确运行,加双重校验锁,但是容易出错,一般用静态内部类,在加载的时候就创建,普通工厂模式, 对于参数的不同,返回不同的实例类。工厂模式实现了使用和创建的分离。但是工厂模式也产生了 产品过多...
2021-10-23 11:57:50 262
转载 2021-10-22
戳气球动规划方法关键是要找出重复计算的部分还有就是找出状态转移方程。当从左到右计算需要右边子问题的计算结果的时候,不妨考虑一下从右到左边计算看看是否是自底向上的,如果是就存储起来。/**class Solution { int []val; int [][]rec; public int maxCoins(int[] nums) { //第一种方法,记忆化搜索。用分治递归的思路。 int n = nums.length; val
2021-10-22 11:24:07 175
转载 求众数-摩尔投票法
求众数这是求众数的变体,需要利用到三个不同的变量进行抵消。最后需要注意的点是,如果没有这样的众数,也会选到两个元素,我们需要再次遍历,然后查看这两个元素是否大于 n/3class Solution { public List<Integer> majorityElement(int[] nums) { int vote1=0; int vote2=0; int element1=0; int element2=0;
2021-10-22 09:58:09 270
原创 接雨水--动态规划和单调栈
接雨水动态规划的思想是,每一个柱子上都有可能接到水,如果利用两个数组维护当前i表示当前i 左边的最大值,和当前i右边的最大值,然后i 能接的雨水就是左右最小值减去当前的i的高度。class Solution { public int trap(int[] height) { int n= height.length; int []left= new int [n]; int leftMax=height[0]; for(int i
2021-10-21 22:17:24 196
原创 一些笔记 刷题
完全平方数有点理解子规模减少之后,变化的方向了。1,4,9,16在 肯定要选择刚好比 n 小的平方数的一个,这样,问题的规模就减少了,由于子问题有可能在以前就出现过,我们可以从子问题一个一个推上去运算,从而产生了动态规划。,最小操作次数使数组元素相等被秀了一波。发现这种题目有一个特征就是不关心数组内部元素的绝对次序,只关心数组的相对大小,对于每一次操作,对n-1个元素增大,就相当于对一个元素减小。所以适合反着做。将所有的数减少到最小的那个元素就可以了。单词搜索2单词拆分 II给定一个非空字
2021-10-20 17:56:25 111
转载 2021-10-19
单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。来源:力扣(LeetCode)链接:https://leetcode-cn.
2021-10-19 21:52:39 111
转载 spring 学习day 2
singleton 和 prototype前者是启动时加载,后者是调用才加载创建对象。并且每一个都不同。bean生命周期这个看弹幕来说是一个重点的知识。第一步执行无参构造第二步设置属性值第三部调用初始化方法第四步获取实例对象第五步获取调用销毁...
2021-10-16 17:25:09 99
转载 最大连续乘积子序列几种解法比较有感
singleton 和 prototype前者是启动时加载,后者是调用才加载创建对象。并且每一个都不同。bean生命周期这个看弹幕来说是一个重点的知识。第一步执行无参构造第二步设置属性值第三部调用初始化方法第四步获取实例对象第五步获取调用销毁...
2021-10-15 21:56:26 176
转载 Spring 学习 IOC
在一个类中需要创建另一个类并且使用它的方法,如果直接创建的话,一旦被创建的类的路径被改变了,会使得调用的也需要跟着改变,所以需要降低它的耦合度。如果使用一个工厂类,然后运用xml 进行路径和类的配对,然后,在工厂类中利用xml进行解析获得类,再返回给调用它的类。这样当被调用的类发生改变的时候就只修改xml的文件就可以了,这样降低了耦合度。这就是将控制交给spring 处理。ApplicationContext 和 BeanFactoryA是B的子接口,功能更加强大,并且A在启动程序的时候就加载了,B
2021-10-15 10:29:12 101
转载 java 的一些基础学习
原来Set<String> new = new HashSet<>();这句代码里面就有HashMapSet里面的add方法调用了Map里面的put方法。这里是可以的。Queue<String>q=new LinkedList<>();其中的add方法出错时抛出异常,offer方法返回false。remove() poll()element() peek()都是类似的道理。PriorityQueue其中如果传入的对象是自定义的话
2021-10-13 17:58:51 113
转载 java 并发 收获
java 语句在执行过程中会执行指令重排序,保证多线程的不出错,那么需要保证程序在执行的过程中,有原子性,可见性,一致性。摆动序列https://leetcode-cn.com/problems/wiggle-sort-ii/本想着在九十分钟冲刺一下做几道题,但是事实上还需要努力啊。苦于最近做题的速度实在是太慢。学到了一种分析方法,先从最简单的,暴力的想法一步步优化我们的代码。主要是需要懂得分析比如对全部的数据进行排序,但是我们并不关心数据内部的情况。所以不需要全部排序,只要拿出中间元素的数字
2021-10-13 16:27:45 119
转载 一些收获java
单词接龙字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:序列中第一个单词是 beginWord 。序列中最后一个单词是 endWord 。每次转换只能改变一个字母。转换过程中的中间单词必须是字典 wordList 中的单词。给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。
2021-10-11 21:40:07 130
转载 java 一些数据结构的补充知识
hashCode哈希表的频繁扩容会导致原有的键值对失效,如果我们事先知道哈希表的大小,可以初始化的时候就指定一个容量。在用其他类作为key时要重写 equal方法,主要是这个方法对应的比较方式对于传入的key equal 和 ==有区别。比如不同的person但是有相同的名字,比较起来就不相等。441.排列硬币没想到在这里也可以用二分查找的算法。确定左右边界之后,因为整数是有序连续的,只需要找到第一个和求和公式最近的那个数字就可以了。class Solution { public i
2021-10-10 09:58:51 98
转载 计数和桶的收获和思路
315.计算右侧小于当前元素的个数给你`一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例 1:输入:nums = [5,2,6,1]输出:[2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1)2 的右侧仅有 1 个更小的元素 (1)6 的右侧有 1 个更小的元素 (1)1 的右侧有 0 个更小的元素对原数组进行一次映射,首先去重,然后假
2021-10-09 19:27:44 139
原创 回溯和搜索的收获
131.分割回文串二维数组向其中填写一些值。可以简化一下代码。Arrays.fill(arrayname,starting index, ending index,value);比如boolean需要初始值为正确的写法。Arrays.fill(arrayname ,starting index ,ending index ,value)动态规划中,处理字符串的每一个子串是否是回文串:转移状态的方程是:当i>=j 两个指针相等或者前指针超过了后指针。然后就是:两端的字符相等。f=new
2021-10-09 16:41:37 107
原创 一些收获和基础的java
对于一些思路简单的题,输入输出的改进是必要的。TreeMap 是一种数据结构,它的key都是经过排序的当获取keySet的时候会以顺序的形式返回遍历结果。其中字符串和整数的key已经给我们排好序。在写新的迭代比较器的时候要注意0 1 -1 这三个值都要返回来。因为当相等的时候也要有返回的比较。补充知识java集合的特点,实现了接口和实现类的相分离。有序表的接口是list,具体的实现类有ArrayList LinkedList二是可以支持泛型,可以限制集合中只能放入一种元素。如:List li
2021-10-09 12:23:51 111
原创 矩阵中的最长递增路径收获
矩阵中的最长递增路径class Solution { //上下左右方向: public int [][]dirc={{-1,0},{1,0},{0,-1},{0,1}}; public int dfs(int [][]matrix,int [][]f,int i,int j){ if(f[i][j]!=0) return f[i][j]; //对四个方向进行搜索,找最长的值,并为f[i][j]记录。 int
2021-10-04 11:37:57 123
原创 最小覆盖子串
收获与感想:java:整数最大值:Integer.MAXVALUE Charactermap.containsKey();获取哈希表的值:Map<Character,Integer> cnt =new HashMap<>();Map<Character,Integer> ori =new HashMap<>();public boolean cheak(){//表示当前条件是否满足最小子串的窗口之一。 for(char ch:ori.ke
2021-09-27 11:07:30 118
原创 2021-09-24
学了什么?第一,java优先队列的底层实现是一个数组。是一个完全二叉树。其中有pq.offer() pq.add()取队首,pq.peek() 删除最大值:qp.poll().优先队列里面的值可以用一个数组作为模板。其中需要重写比较函数PriorityQueue<int []>pq = new PriorityQueue<int[]>( new Comparator(){ public int compare(int[]pair1,int[]pair2){ retu
2021-09-24 21:40:25 116
原创 刷题刷刷刷
用 Rand7() 实现 Rand10()拒绝采样的问题,用一个随机数生成另一个随机数,可以用建立一张二维表,扩大数的范围,根据坐标均匀编排数字。填充每个节点的下一个右侧节点指针层次遍历基于广度优先搜索,它与广度优先搜索的不同之处在于,广度优先搜索每次只会取出一个节点来拓展,而层次遍历会每次将队列中的所有元素都拿出来拓展queue 队列的每一层都是可以先用size获取它的层数进行。全排列直观的想法是看每一个空可以填哪一个剩下的数。但其实可以在原来的数组出发,划分为左右已经填好的数,在一个指针的
2021-09-07 19:21:38 125
原创 每日三题day5/21
找前k个最小值可以用最大堆。建堆默认是利用数组前k个元素当作它们是最小,如果有比最大堆最大的元素更小的数,那么弹出堆顶,弹入元素。最后遍历堆的元素即可。class Solution: def smallestK(self, arr: List[int], k: int) -> List[int]: #建立一个最大堆 if k==0: return list() heap=[-arr[i] for i in range(
2021-09-03 21:13:27 106
原创 python 3 sorted([], key=lambda x: len(str(x)))根据元素长度排序
print(sorted([13, 1, 100, 89, 237], key=lambda x: len(str(x))))#[1, 13, 89, 100, 237]print(sorted([13, 1, 1,'a', 89, 237], key=lambda x: len(str(x))))#[1, 1, 'a', 13, 89, 237]#相同长度的按照原来的顺序排列
2021-06-13 11:45:15 3568 3
原创 python习题的一些零散
参数带两个星号:会将传入的参数转化为字典并且sorted()默认是对字典的键从小到大进行排序def func(**p): return ''.join(sorted(p))print( func(x=1, z=3, y=2))'''xyz'''参数之前带一个星号:参数列表中有一个*符号,这个符号我们不能将其理解为一个参数,而是一个分隔符。*分隔符后面的参数,在函数调用时,必须使用key=value形式。reduce() 函数会对参数序列中元素调用参数中的函数进行计算:from
2021-05-26 11:27:35 404
原创 python列表推导式一些例子
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。index() 函数用于从列表中找出某个值第一个匹配项的索引位置。x = [3,5,3,7]print([x.index(i) for i in x if i==3] )'''[0,0]'''无放回的抽样:使用 random.sample有放回用choice()...
2021-05-25 20:44:22 672
原创 两个有序序列的中位数
3-3 两个有序序列的中位数 (20 分)已知有两个非降序序列S1, S2, 求S1与S2归并成一个序列的低位中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。输入格式:输入分4行。第一行给出第一个序列的长度N1(0<N1≤2500000),随后是第一个序列的信息,即N1个非降序排列的整数。数字用空格间隔。随后是第二个序列的长度N2(0<N2≤2500000)和信息。因为测试数据只能10M,2.5*10的6次方规模,二分效
2021-04-22 21:18:12 793
原创 python 函数一些参数的笔记
python 中函数参数关键字是用来防止函数参数关键字顺序出现错误的,在函数调用时,函数关键字的位置可以随意调换。当然也可以和位置关键字参数进行调换,这时候函数关键字只能放到最后。在实参面前加上星号可以将列表或者元组的元素作为单个参数传递给函数作为参数但是如果是字典类型的话就要在实参前面加两个星号,定义的时候也要加上。字典类型的key如果和函数参数的名字相同,可以分开传进函数中def testDic(**op): '字典的参数' print(op)dic={"a":1,"b":2
2021-04-21 11:19:36 113
原创 day3-007-数组-移动零
移动零主要可以将前面的部分的数组理解为空的数组就可以了,不要太注意其中原来有没有数字!class Solution {public: void moveZeroes(vector<int>& nums) { int index=0; for(int i=0;i<nums.size();i++){ if(nums[i]!=0){ nums[index++]=nums[i]; } } for(int i=
2021-04-15 16:11:33 110
python差点踩坑
python差点踩坑:步长虽然是2,但是起点是0啊。x = list(range(10))del x[::2]print(x)#[1, 3, 5, 7, 9]在这里x = [1, 2, 3, 4, 5]x[1::2] = sorted(x[1::2], reverse=True)print(x)#[1, 4, 3, 2, 5]
2021-04-14 22:06:32 441
原创 day2-006-数组-数组加一
数组加一我的思路是基于大数加法。如果有进位那就将他们在后面加上一位就好了。class Solution {public: void plus(vector<int>& digits,int i){ if(digits.size()==i)digits.push_back(1); else if(digits[i]+1==10){ digits[i]=0; plus(digits,i+1); } else{ digits[i]+=1;
2021-04-14 16:40:46 194
原创 day2-005-数组-两个数组的交集
两个数组的交集刚开始想对其中一个长度较大的数组进行排序然后利用长度较小的数组进行查询,但是发现这种方法对于长度较小的有重复元素的交集的数组就不行了,因为它无法区分是搜索了哪个元素。[1,2,2][1,1]class Solution {public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int>nums3; int siz
2021-04-14 16:08:50 126
转载 da2-004只出现一次的数字
异或运算可以排除掉重复的数字class Solution { public int singleNumber(int[] nums) { int reduce = 0; for (int num : nums) { reduce = reduce ^ num; } return reduce; }}用集合解决:public int singleNumber(int[] nums) {
2021-04-14 11:24:15 80
转载 旋转数组-day1-003
旋转数组给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例
2021-04-13 21:55:58 138
转载 删除排序数组中的重复项001
删除排序数组中的重复项给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDu
2021-04-13 20:01:54 97
原创 第3章-6 求整数序列中出现次数最多的数 (15 分)
第3章-6 求整数序列中出现次数最多的数 (15 分)本题要求统计一个整型序列中出现次数最多的整数及其出现次数。输入格式:输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。输出格式:在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。输入样例:10 3 2 -1 5 3 4 3 0 3 2输出样例:3 4num=input().split()nums=num[1:]from collections im
2021-03-18 21:27:06 282
原创 c++建立二叉树,后序遍历非递归输出
后序遍历需要借助一个pre指针来判定之前走过的路径。后序遍历过程中节点可以访问的标志是,当前节点没有孩子,或者当前节点的前一个节点是左右孩子中的一个。#include<iostream>#include<stack>using namespace std;struct Node{ char data; Node *lchild; Node *rchild;};Node*createTree(){ char x; cin>>x; if(x=='#'
2021-01-17 10:47:12 375
原创 c++求带父亲节点的两个节点的最近祖先
c++求带父亲节点的两个节点的最近祖先思路是先找到这两个叶子节点的在二叉树的位置,然后沿着祖先用一个栈保存从叶子节点到根节点的路径。比较两个叶子节点的路径节点,找出最后一次相等的节点,这个节点就是他们的公共祖先。#include<iostream>#include<stack>using namespace std;//求两个叶子节点的最近共同祖先,默认节点的值都不同,有指向父亲的节点。 /* 测试用例:1 2 4 # # 5 # # 3 # #*/struct N
2021-01-16 20:34:54 253
原创 c++递归建立树,递归求树的节点数
递归建立树,递归求树的节点数递归式子是左子树节点数+右子树节点数+1#include<iostream>#include<stack>using namespace std;int count=0;struct Node{ char data; Node *lchild; Node *rchild;};Node*createTree(){ char x; cin>>x; if(x=='#')return NULL; Node *root=ne
2021-01-16 17:28:00 546
原创 c++先序遍历创建树和输出树。
用递归的方法建立,先左后右。依次创建左右子树。#include<iostream>#include<stack>using namespace std;struct Node{ char data; Node *lchild; Node *rchild;};Node*createTree(){ char x; cin>>x; if(x=='#')return NULL; Node *root=new Node; root->data=x;
2021-01-16 17:18:26 665
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人