算法
独饮醉归人
咸鱼吐泡泡
展开
-
KMP - leetcode28. 实现 strStr()
KMP算法原理分析原创 2022-07-22 22:36:30 · 181 阅读 · 0 评论 -
lowbit(x)的原理解析
lowbit(x)函数返回x二进制下最低位的1代表的十进制数,比如(二进制) x=1100 ,lowbit(x)代表 100原理解析lowbit(x)= x & (~x+1) 假设 x的二进制表示为 11100 ,那么 ~x 表示为 00011 ,~x+1=00100 , 最低位的1的 位数不变, 进行 & 运算 返回 100证明: 假设最低位的1在第 k 位,后面还有 m 个0(m>=0),即..100(m个0) 那么取反运算后,后m位 0 都会变成原创 2021-11-03 21:47:07 · 364 阅读 · 0 评论 -
二维数组、对象数组、集合排序
二维数组排序 int a[][] ={{1,2},{4,3},{2,1},{2,-1}}; Arrays.sort(a,new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { //如果第一个数字相等,比价第二个 if(o1[0]-o2[0]==0) return o1[1]-o2[1]; return o1[0]-o2[0]; }原创 2021-04-25 22:40:08 · 112 阅读 · 0 评论 -
有重复元素的二分
普通二分思路:逐渐缩小区间,直到找到,或者找不到,跳出循环int l=0; int r=arr.length-1; int mid=0; while(l<r) { mid=l+((r-l)>>1); if(arr[mid]==value) return mid; else if(arr[mid]>value) r=mid-1; else l=mid+1; } return -1;有重复元素的二分取第一原创 2021-04-24 22:42:34 · 116 阅读 · 0 评论 -
分解质因数的误区
分解质因数的误区误区正解误区我原来的想法是找到除数范围内的所有质因数,建立了一个素数筛,然后逐个便利判断是是除数的引述,很是麻烦,而且时间复杂度高,大致为O(n)级别代码如下:package 啊哈添柴;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Scanner;import java.util.Set;public class 分解质因数 { st原创 2020-12-03 22:42:19 · 153 阅读 · 0 评论 -
2020-11-15
国赛出来了,没拿奖,没啥好说的没有好好的准备,自己的努力也不足,自己也菜平时在小组的小组学习时间因为一些杂七杂八的事情都比别人少,基础算法有的也搞不懂总之,这个比赛做的很难受,对自己也有点失望以后多努力...原创 2020-11-15 13:50:39 · 78 阅读 · 0 评论 -
递归理解
递归–递推–动态规划首先,我的理解这三种都是一种形式、一个思想。包括递推、dp都可以算作是递归。用递归的形式,代码简洁,但是效率低(改进,记忆性递归)。dp,递推代码比较多,但是效率高下面看我学的几个例题:上楼梯题意:小明上楼梯,他一次能上一层、两层、或者三层,问100层楼梯,有多少种走法递归分析:每在一层楼都可以分为三种情况,往上走1、走2、走3。反之,每一层都是由三种走上来的。由下面一层、下面两层、下面三层走上来。所以,往下递归,每一层都有三种情况:n-1,n-2,n-3递推分析:每一层都原创 2020-11-07 22:30:14 · 119 阅读 · 1 评论 -
递归小结
找重复:找到一种划分方法找到递推公式或者等价转换 都是父问题转换为求解子问题,其中会有变化的量子问题和父问题有一样的表现形式.找变换的量变化的量通常要作为参数找参照找到相对参照,有些题中参照物是不断变化的,因此传入的参数也要改变顺序找出口(所有的循环都可以改成递归,因为循环都是重复)汉诺塔,将1-N从A移动到B,c可以作为中转:1~N-1移动到c,b为辅助把N移动到B把1~N-1 从c移动到B,A为辅助/** * 汉诺塔递归解法 */public cla原创 2020-09-22 20:04:58 · 104 阅读 · 0 评论 -
队列
队列: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。问题: 给你一串被加密的数字,解密的方法是将其第一个数字删除,第二个数字放到这串数的末尾,删除第三个数字,第四个数字放到这串数字的末尾........删除数字的顺序得到的数字串即为要得到的答案。public class 解密 { public s...原创 2020-05-24 01:35:31 · 185 阅读 · 0 评论 -
排序(三)
桶排序先说一个简化的桶排序:你输入6个数字,这些数字在1—10之间,把他们从大到小排序可以建立0—11的数组,a[10],每出现一个数字X,a[x]++;相当于建立10个桶 ,把和下标相同的数字放入桶中但是有个缺点就是非常浪费空间import java.util.Scanner;/** * @author 落叶知秋 * 简化版本德桶排序。非常快,但是特别浪费空间 * 而且...原创 2020-05-03 19:06:00 · 133 阅读 · 0 评论 -
快速排序
最近做题,发现冒泡和选择排序的复杂度太大了,容易超时,于是就学习了快排****快排:简单地说就是找到一个基准数字m,数组中比m大的放在右边,比m小的放在左边,这样m的位置是正确的的。然后利用递归再分别对两边进行快排下面我逐步讲解一下快排的思路:1.假定对数组{6,1,7,5,3,11}进行快排2.首先在这个序列中找一个数作为基准数,为了方便可以取第一个数63.进行初步快排之后,变成{5,...原创 2020-04-25 04:21:35 · 116 阅读 · 0 评论 -
日常刷题
CodeForces - 1328CA number is ternary if it contains only digits 0, 1 and 2. For example, the following numbers are ternary: 1022, 11, 21, 2002.You are given a long ternary number x. The first (left...原创 2020-04-19 17:21:14 · 142 阅读 · 0 评论 -
进制转换
进制转换进制转化的几个方法进制转化在JAVA中已经封装好了.无论是常规的10转2,8,16,还是相对应的2,8,16进制转化为10进制的方法,当然也包括10->n进制,n进制转10进制的常规方法.都被封装在Integer对象中.10进制转化其他进制对应的方法,参数:n(原10进制数据),r(进制)返回值10进制转二进制Integer.toBinaryStri...原创 2020-03-29 19:27:45 · 137 阅读 · 0 评论 -
巴什博奕
巴什博奕A和B数30块石头,每人每次数最少1个,最多数4个,看谁先数到最后一个即为胜者。思路,s=m+1,AB每次保的数字都在这个范围内,故想办法给对手留下m+1个石头,就可以胜利判断 n=k*(m+1)+j若j=0,则A必输若j!=0,则A必胜变种前提不变,获胜条件变成谁数到最后一个输这次想办法留给对手一个石头即为获胜即公式可变为 n-1=k*(m+1)+j;如果j=...原创 2020-03-15 19:38:19 · 126 阅读 · 0 评论 -
排序(一)
冒泡排序原理:如果是想从小到大排序,拿出数组两位数比较,小的放前,大的放后,如此反复的交换位置就可以得到排序的效果。package 测试代码;public class 冒泡排序 { public static void main(String[] args) { int []arr= {1,2,7,5,4}; for(int i=0,m=arr.length;i<m;i+...原创 2020-03-08 19:14:08 · 118 阅读 · 0 评论