![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
大佬们瞧不上眼的基本算法
小吴同学GOGOGO
一只怀揣梦想的阿柴;五角场某高校同学、某大厂打工人;兴趣方向:OLAP基础架构、大数据存储和计算引擎;「计算机小屋」
展开
-
无序链表的归并排序 - Java代码纯享版
链表归并排序原创 2022-07-30 18:59:46 · 260 阅读 · 0 评论 -
树状数组-Java代码纯享版
树状数组的java实现原创 2022-07-29 21:46:24 · 352 阅读 · 1 评论 -
剑指offer -旋转数组的最小数字-二分的巧妙应用
题目:解体思路:像这种全局有序(或者分成一半有序的),尝试查找某一个元素,可以通过二分来解决。二分每次都可以确定一部分序列,这样可以通过在这部分符合条件的序列中再次查找对应的数据。代码如下:class Solution { public int minArray(int[] numbers) { //二分 int len = numbers.length; int left = 0; int right = len-1;原创 2022-03-15 17:57:58 · 228 阅读 · 0 评论 -
牛客ACM模式-Java-总结
原创 2022-03-02 21:30:59 · 1212 阅读 · 0 评论 -
leetcode33-搜索旋转排序数组-技巧二分
这道题的思想就是二分,但是因为不是传统的有序数组,但是也是可以进行二分的。因为对于这一段序列,他其实也是两段有序的序列合并的,所以如果每次选取一个mid之后,总会且分出一段是有序的,而另一段是无序的或者有序,所以总会有一段是确定有序的,所以我们的着手点就是那段有序的序列,所以我们可以进行二分,二分代码:class Solution { public int search(int[] nums, int target) { int len = nums.length; .原创 2022-02-25 22:11:18 · 161 阅读 · 0 评论 -
力扣189-轮转数组的普通解法+技巧解法
普通解法有很多种,这里着重介绍技巧解法,题目的的目的是为了把数组最后k%len个元素放到前面去,所以我们可以先总体上翻转数组,这样,最后k个元素就放到了最前面k个位置,只不过顺序相反而已,所以我们可以依次翻转前K个和后面的n-k个元素。代码如下(ps:找实习真滴难)普通解法:class Solution { public void rotate(int[] nums, int k) { int len = nums.length; int[] next = ne.原创 2022-02-19 14:21:07 · 305 阅读 · 0 评论 -
力扣1673 找出最具竞争力的子序列
解题思路:本题根据题意,寻找特性,首先是一个子序列,而且是固定长度的,而且有一个条件是,前几个数字在整个数组中越小越好,所以可以想到单调栈,单调栈保证栈中的数据都是单调递增的,这样就可以保证序列中的前几个数据都是尽量比较小。class Solution { public int[] mostCompetitive(int[] nums, int k) { // 单调递增且每次递增的元素都是后面最小的 Deque<Integer> queue = new.原创 2022-02-15 16:46:13 · 310 阅读 · 0 评论 -
力扣152-乘积最大子数组
本题的难点在于:存在部分负数的情况,我们最开始想到的就是维护一个局部最大值imax,然后将Imax和当前值想乘,同时比较,谁大取谁,但是这里面存在负数,所以就需要维护一个最小值,因为一个较大的值乘以负数,会变为最小的值,所以维护一个imin,只要当前的这个元素小于0,就交换imax和imin,所以imax始终为当前乘积的最大值,然后和全局res比较,取最大值。代码如下:class Solution { public int maxProduct(int[] nums) { //.原创 2022-02-15 15:45:50 · 70 阅读 · 0 评论 -
LeetCode 131-分割回文串
思路:搜索分割点,每次判断当前分割点喝上一个分割点之间的数据是否为回文串,如果是,就继续搜索下一个。(来实验室工作的第二天,加油!)class Solution { String str; int len; LinkedList<LinkedList<Integer>> list = new LinkedList<>(); public boolean check(String s){ // 判断s是否是回文字符串.原创 2022-02-11 15:25:16 · 390 阅读 · 1 评论 -
Java中Volatile关键字学习
Java提供了一种稍弱一点的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。volatile变量具备两种特性,即变量可见性和禁止重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方, 因此在读取volatile变量的时候总会返回最新写入的值。原理:当对非volatile变量进行读写的时候,每个线程先从内存拷贝变量到CPU的cache中,如果计算机有多个cpu,你们每个线程可能在不同的CPU上被处理,这意味着每个线程可以copy到不同的CPU的cache中原创 2022-02-06 13:36:43 · 84 阅读 · 0 评论 -
java协调线程同步的几个工具类:CountDownLatch, CyclicBarrier, Semaphore
Java中用来协调多个线程之间的同步,或者说起到线程之间的通信。这里介绍三种工具类:CountDownLatch(线程计数器)、CyclicBarrier(回环栅栏), Semaphore(信号量)。CountDownLatch(线程计数器)通过计数器做减法,以此来达到效果。比如一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch 来实现这种功能了。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行。public class CountDownL原创 2022-02-06 12:47:58 · 562 阅读 · 0 评论 -
leetcode-5935-利用前缀和的思想(个人称呼为递增前缀和递减前缀)的思想来预处理进行打表
双百通过代码如下:class Solution { public List<Integer> goodDaysToRobBank(int[] security, int time) { int len = security.length; // 包括当前这个数 int[] increase = new int[len]; int[] decrease = new int[len]; increase[原创 2021-12-12 15:01:49 · 4400 阅读 · 0 评论 -
Java实现线段树
package normalTest;import sun.text.resources.cldr.ig.FormatData_ig;import javax.jnlp.SingleInstanceListener;public class segment_tree { // 弥补前缀和在更新某一个元素之后,需要重新更新正哥前缀和数组 // 通过线段树 private int[] array = {1, 3, 5, 7, 9, 11}; private int[]原创 2021-11-22 14:08:09 · 372 阅读 · 0 评论 -
leecode496下一个更大元素-单调栈和hash
题目:思路:通过单调栈保存右侧第一个最大值,然后通过建立element -> index的映射即可代码:class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; int[] res = new int[len1]; // 建立单调原创 2021-10-26 12:36:05 · 72 阅读 · 0 评论 -
剑指offer008:和大于等于target的最短子数组 -前缀和+双指针
题目如下:思路:先构造前缀和数组,通过双指针不断探索符合条件的数据并且更新数组即可。代码:class Solution { public int minSubArrayLen(int target, int[] nums) { // 前缀和 + 双指针 int len = nums.length; // 前缀和 preSum[i] = preSum[i-1] + num[i-1]; int[] preSum = new int[原创 2021-10-23 13:22:23 · 351 阅读 · 0 评论 -
leetcode476:数字的补数:位操作
思路:本题考查的是位操作:先从左到右找到第一个不为0的位置pos,然后将从0到pos位置的数字取反即可。判断该位数字是否为1的方法是:先将数字右移到最后一位,然后和1相与,即可找到该位数字;取反的操作可以利用异或:和1异或表示取反,和0异或表示保持数字不变。class Solution { public int findComplement(int num) { int pos = -1; // 找到合适的位置 for(int i=31;i&g.原创 2021-10-18 14:09:51 · 69 阅读 · 0 评论 -
力扣秋季赛-第二题-心算挑战
题目描述:思路:其实这一题最开始我是使用dfs进行搜索的,状态为dfs(pos, sum);pos为当前枚举的cnt的位置,sum为当前的总和,但是由于数据量较大,容易超时。其实这一题可以通过将奇数和偶数分离,然后根据cnt来选择不同数量的奇数或者偶数,当然,选择的依据就是从大到小开始选择。代码:class Solution { public int maxmiumScore(int[] cards, int cnt) { int len = cards.length;原创 2021-09-11 20:04:05 · 147 阅读 · 0 评论 -
力扣502-IPO-hard-贪心,优先队列 -java
思路:本题可以先构造处一个模型,我们的目的在于满足小于等于w的基础上,使得加上profits最大即可,因为是纯利润,不需要考虑w-capital的情况,所以我们只需要构造一个大根堆将所有满足条件的profits加入到堆中即可。st. w>= capitals[i].代码:// @author:hairu,WU, fduclass Solution { public int findMaximizedCapital(int k, int w, int[] profits, int[] .原创 2021-09-08 10:25:39 · 87 阅读 · 0 评论 -
力扣239-滑动窗口最大值-单调队列
题目如下:分析:利用单调队列,保持按照从大到小的顺序存放,同时为了保持滑动窗口的长度,所以队列中保存的是数据的下标。代码如下:int len = nums.length; List<Integer> list = new ArrayList<>(); //存放结果 LinkedList<Integer> queue = new LinkedList<>(); int left=0,right=0;原创 2021-09-06 14:09:43 · 104 阅读 · 0 评论 -
牛客网-今年的第几天-日期的处理
题目描述输入年、月、日,计算该天是本年的第几天。输入描述:包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。输出描述:输入可能有多组测试数据,对于每一组测试数据,输出一个整数,代表Input中的年、月、日对应本年的第几天。示例1输入复制1990 9 202000 5 1输出复制263122这里...原创 2020-05-03 17:17:05 · 143 阅读 · 0 评论 -
大数的阶乘-手动模拟法
题目:给定一个n,求得n!.比如:3,输出6可以利用大数的原理,进行手动乘法,模拟即可///@author:hairu,wu//@from:ahut#include<iostream>#include<memory.h>using namespace std;struct bign{ int a[2000]; int size; bign(){ s...原创 2020-05-03 14:32:36 · 94 阅读 · 0 评论 -
L2-010 排座位 (25分) - 模拟+并查集
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。输入格式:输入第一行给出3个正整数:N(≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系...原创 2020-04-30 11:49:32 · 407 阅读 · 0 评论 -
计蒜客-A1005-淘汰赛车-(模拟)
本题题目较长,乍一看起来不太好明白,确实,也不是太好些,但是我们自习分析一下,首先是存储的问题,如何存储?首先我们可以将小车 设一个结构体,然后保存其起点和终点,同时保存其来回跑的长度;然后我们对于每一次询问,遍历每辆车,如果符合条件,也就是在t时间的时候,如果这两车跑了t距离,且正好在范围之内,那么ans++;如何判断在范围内,这里注意一点,如果直接取模,肯定不对,因为他不是到了终点之后,...原创 2020-04-21 19:40:15 · 231 阅读 · 0 评论 -
计蒜客-A1003-合并两个飞有序的链表(C++vector实现)
本题测试用例比较坑,一开始我是按照两两按照序号对比,然后每次添加两个,发现过不了,然后就看了一下网上大神写的,发现应该是如果第一个小于等于第二个数,那么第一个指针偏移,只能说明用例不清楚,然后输入的时候用cin输入可以输入整数,然后char ch,用ch接收字符判断即可,用vector存储。//@author:hairu,wu#include<iostream>#includ...原创 2020-04-21 17:46:42 · 169 阅读 · 0 评论 -
大整数相加(C++实现)
求两个不超过 200200 位的非负整数的和。输入格式有两行,每行是一个不超过 200200 位的非负整数,可能有多余的前导 00。输出格式一行,即相加后的结果。结果里不能有多余的前导 00,即如果结果是 342342,那么就不能输出为 03420342。输出时每行末尾的多余空格,不影响答案正确性样例输入复制2222222222222222222233333333333333333...原创 2020-04-19 18:18:18 · 3304 阅读 · 0 评论 -
计蒜客-3177-蒜头君的花园(dp)
蒜头君的花园里有 nn 个花盆,每个花盆可以种一株花,现在花椰妹给了蒜头君三种种花的方案但是花椰妹的每种方案种的都是同一种花,只是形状不同全部种 AA 花,第 ii 盆花的价格为 a_iai全部种 BB 花,第 ii 盆花的价格为 b_ibi全部种 CC 花,第 ii 盆花的价格为 c_ici可是蒜头君觉得整个花园都是同一种花不好看,但是他又不想浪费了花椰妹的好意所以...原创 2020-03-30 21:08:36 · 636 阅读 · 0 评论 -
计蒜客-1265-补提交卡-(转换思维)
本题可以转换一下思维,因为他让你求的是通过补卡,从而求最长连续多少天,我们可以将其转化为,先将每段提交的时间记录下来,然后枚举m+1个子段来取最大连续天数即可#include<iostream>#include<vector>using namespace std;int main(){ int T; cin >> T; while(T--)...原创 2020-03-30 19:20:17 · 205 阅读 · 0 评论 -
计蒜客-2022-无线网络发射器选址-模拟
随着智能手机的日益普及,人们对无线网的需求日益增大。某城市决定对城市内的公共场所覆盖无线网。假设该城市的布局为由严格平行的 129129 条东西向街道和 129129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 11。东西向街道从北到南依次编号为 0,1,2 \ldots 1280,1,2…128,南北向街道从西到东依次编号为 0,1,2 \ldots 1280,1,2…...原创 2020-03-30 15:47:32 · 329 阅读 · 0 评论 -
计蒜客-2011-铺地毯----一道坑题。。。
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标 系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到 nn。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。输入格式输入共 n+2...原创 2020-03-28 22:15:35 · 199 阅读 · 0 评论 -
计蒜客-2097-机器翻译
小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。假设内存中有 MM 个单元...原创 2020-03-27 21:11:30 · 253 阅读 · 0 评论 -
计蒜客-1210-区间合并
蒜头君给定 nn 个闭区间 [a_i, b_i][ai ,bi ],其中 i=1,2,…,ni=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1,2][1,2] 和 [2,3][2,3] 可以合并为 [1,3][1,3],[1,3][1,3] 和 [2,4][2,4] 可以合并为 [1,4][1,4],但是 [1,2][1,2] 和 [3,4][3,4]...原创 2020-03-26 22:57:36 · 410 阅读 · 0 评论 -
计蒜客-1407-小猴子下落
输入二叉树叶子的深度 DD,和小猴子数目 II,假设 II 不超过整棵树的叶子个数,D \le 20D≤20,最终以 00 00 结尾。输出格式输出第 II 个小猴子所在的叶子编号。输出时每行末尾的多余空格,不影响答案正确性样例输入复制4 23 40 0样例输出复制127本题考查的就是基本的二叉树规律,基本没什么难度,关键是确定数据的范围,防止数组开的过大或者太小//@au...原创 2020-03-26 18:29:16 · 283 阅读 · 0 评论 -
计蒜客-1189-树根
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。比如,对于 2424 来说,把 22 和 44 相加得到 66,由于 66 是一位数,因此 66 是 2424 的数根。再比如 3939,把 33 和 99 加起来得到 1212,由于 1212 不是一位数,因...原创 2020-03-26 17:42:48 · 297 阅读 · 0 评论 -
计蒜客-1216-分成互质组
蒜头君给定 nn 个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?输入格式第一行是一个正整数 nn。1 \le n \le 101≤n≤10。第二行是 nn 个不大于 1000010000 的正整数。输出格式一个正整数,即最少需要的组数。输出时每行末尾的多余空格,不影响答案正确性样例输入复制614 20 33 117 143 175样例输出复制3本题可用...原创 2020-03-26 17:09:09 · 1110 阅读 · 0 评论 -
计蒜客-1373-百钱买百鸡-复杂度优化
百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用 100100 文钱买 100100 只鸡,公鸡、母鸡、小鸡各买多少只?本程序要求解的问题是:给定一个正整数 nn,用 nn 文钱买 nn 只鸡,问公鸡、母鸡、小鸡各买多少只?输入格式输入一个正整数 nn。输出格式如果有解,依次输出公鸡、母鸡、小鸡的个数(用正整数表示)。如果无解,输出"No Answer."。数据范围...原创 2020-03-25 11:57:44 · 1363 阅读 · 0 评论 -
计蒜客-1414-抠图
蒜头君以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。已知图中除了黑线上的点外,图像中没有纯黑色(即像素为 00 的点)。输入格式第一行输入测试数据的组数 N(0 < N \le 10)N(0<N≤10)。每组测试数据的第一行是两个个整数 W,HW,H 分表表示图片的宽度和...原创 2020-03-24 17:00:06 · 351 阅读 · 0 评论 -
计蒜客-非常男女-1853
近来,蒜头君致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验。例如,据他观察,身高相近的人似乎比较合得来。万圣节来临之际,蒜头君准备在学校策划一次大型的“非常男女”配对活动。对于这次活动的参与者,蒜头君有自己独特的选择方式。他希望能选择男女人数相等且身高都很接近的一些人。这种选择方式实现起来很简单。他让学校的所有人按照身高排成一排,然后从中选出连续的...原创 2020-03-24 15:40:34 · 834 阅读 · 0 评论 -
计蒜客-T1230-热血格斗场
蒜头君新开了一家热血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。我们假设格斗的实力可以用一个正整数表示,成为实力值。另外,每个人都有一个唯一的 \text{id}id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有两个人的实力值与他差别相同,则他会选择比他...原创 2020-03-23 11:07:42 · 482 阅读 · 0 评论 -
计蒜客-T1600-最短路
在每年的比赛里,所有进入决赛的同学都会获得一件很漂亮的 t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?输入格式输入包括多组数据。每组数据第一行是两个整数 NN、MM(N \le 100N≤100,M \le 10000M≤10000),NN 表示大街上有几个路口,标号为 11 的路口是...原创 2020-03-19 11:49:28 · 519 阅读 · 0 评论 -
计蒜客-1726-下午茶时间-并查集
本题是一个很经典的并查集的应用,题目不难,就是利用并查集的知识即可,代码如下:#include<iostream>using namespace std;const int max_n=2000;int root[max_n];/*@author:HaiRU,WU@from:AHUT*/int findRoot(int x){ if(root[x]==-1)...原创 2020-03-18 21:37:22 · 324 阅读 · 0 评论