
算法
时间不会赖着不走
这个作者很懒,什么都没留下…
展开
-
快速排序(思想)
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];3)从j开始向前搜索,即由后开始向前搜索(j–),找到第原创 2022-04-20 09:44:08 · 138 阅读 · 0 评论 -
Java中递归实现计算1 ~ n的和
分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。代码如下:public class test { public static int getsum(int t){ if(t==1){ return 1; } return t+getsum(t-1); } public static void main(String[] args) { i原创 2022-03-30 16:17:07 · 1891 阅读 · 0 评论 -
java中的比较器
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。通常对象之间的比较可以从两个方面去看:第一个方面:对象的地址是否一样,也就是是否引用自同一个对象。这种方式可以直接使用“==“来完成。第二个方面:以对象的某一个属性的角度去比较。有两种方法:1、继承Comparable接口,并实现compareTo()方法;2、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。...原创 2022-02-20 12:03:31 · 281 阅读 · 0 评论 -
java实现快速排序的非递归实现
java实现快速排序的非递归方法,用栈来进行实现代码如下:import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class code18_QuickSortRecursiveAndUnrecursive { /*** * 快排非递归的方法 * * * * */ // 荷兰国旗问题 public s原创 2022-02-17 23:53:24 · 855 阅读 · 0 评论 -
java实现快速排序
荷兰国旗问题的递归调用就是快速排序代码如下public class Code17_PartitionAndQuickSort { /** * 荷兰国旗 和 快速排序 * * 荷兰国旗问题 * 给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。 * 要求额外空间复杂度O(1),时间复杂度 O(N) * * * <= X > X *原创 2022-02-17 23:51:23 · 559 阅读 · 0 评论 -
Java - 队列(Queue)的基本用法
LinkedList 实现了 Queue 接口,可作为队列使用。队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。add()和remove()方法在失败的时候会抛出异常(不推荐)添加元素queue.offer(“a”);返回第一个元素,并在队列中删除queue.poll()返回第一个元素queue.element()queue.peek()测试代码pack原创 2022-02-17 23:28:51 · 1473 阅读 · 0 评论 -
java中栈Stack的基本方法
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。Stack()除了由Vector定义的所有方法,自己也定义了一些方法:序号 方法描述1 boolean empty()测试堆栈是否为空。2 Object peek( )查看堆栈顶部的对象,但不从堆栈中移除它。3 Object pop( )移除堆栈顶部的对象,并作为此函数的值返回该对象。4 Object push(Ob原创 2022-02-17 14:21:16 · 446 阅读 · 0 评论 -
Java Vector 类 实现动态数组
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:Vector 是同步访问的。Vector 包含了许多传统的方法,这些方法不属于集合框架。Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。Vector 类支持 4 种构造方法。第一种构造方法创建一个默认的向量,默认大小为 10:Vector()第二种构造方法创建指定大小的向量。Vector(int size)第三种构造方法创建指定大小的向量,并且增量用 incr 指定。原创 2022-02-17 14:04:38 · 453 阅读 · 0 评论 -
荷兰国旗问题
问题描述给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)解决思路1 当前数<目标 当前数和 <区的下一个交换 <区 向右扩 当前数跳下一个2 当前数=目标 当前数直接跳下一个3 当前数>目标 当前数和 >区前一个交换 <区左扩 当前数不变方法如下 /** * * 1 当前数<目标 当前数原创 2022-02-16 21:57:41 · 477 阅读 · 0 评论 -
力扣 327 区间和的个数 java题解
题目描述给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。示例 1:输入:nums = [-2,5,-1], lower = -2, upper = 2输出:3解释:存在三个区间:[0,0]、[2,2] 和 [0,2] ,对应的区间和分别是:-2 、-1原创 2022-02-11 16:33:10 · 686 阅读 · 0 评论 -
51Nod - 2062 2062 两个有序数组的归并 java题解
题目描述输入一个整数n(n <= 10000)和n个整数a[i],保证这n个整数已按照从小到大进行排序。然后输入一个整数m(m <= 10000),和m个整数b[j],保证这m个整数已按照从小到大进行排序。将两组数归并后输出。输入第一行输入一个整数n。接下来n行,每行输入一个整数a[i]。接下来1行输入一个整数m。接下来m行,每行输入一个整数b[j]。输出n+m行,一行一个整数。数据范围4% 2 <= n <= 450 0 <= m <= 5100原创 2022-02-06 12:41:30 · 806 阅读 · 0 评论 -
51nod3047 位移运算 java题解
题目描述给出两个数a,b。问a能否只通过位移运算( >>和 << 可以多次使用)变成b。如果可以输出"Yes",否则输出"No"。输入第一行:一个数 t ( 1≤t≤100000)。第2 ~ t+1行:每行2个a,b中间用空格分隔(0≤a, b≤10^9)。输出输出共t行,对应答案的"Yes"和"No"数据范围对于20%的数据,1≤t≤50,0≤a, b≤20;对于40%的数据,1≤t≤2000;对于100%的数据,1≤t≤100000,0≤a, b≤10^9;原创 2022-02-03 15:49:50 · 882 阅读 · 0 评论 -
java中求解一个数是不是2的n次方
用的log方法 通过比较该数是不是2的n次方 先double后intimport java.util.Scanner;import static java.lang.Math.log;public class code18 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); double原创 2022-02-03 15:15:45 · 664 阅读 · 0 评论 -
java中直接将数字转化成二进制的方法
将整形的数字转成为二进制package bailaoVJ;import java.util.Scanner;public class code17 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String s = Integer.toBinaryString(n); S原创 2022-02-02 20:49:02 · 6417 阅读 · 0 评论 -
51Nod-3285 字符替换
题目描述:把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。Input只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。 字符串是待替换的字符串,字符串长度小于等于30个字符,且不含空格等空白符;接下来一个字符为需要被替换的特定字符;接下来一个字符为用于替换的给定字符。Output一行,即替换后的字符串。SampleInputcopy hello-how-are-you o OOutputcopyhellO-hOw-are-yOuAC代码import java原创 2022-01-31 18:12:38 · 255 阅读 · 0 评论 -
java改编归并排序实现求解逆序对的数量
逆序对问题 用改写归并排序过程解决* 逆序问题 左边的数如果比右边的数大,则折两个数构成一个逆序对,打印逆序对的数量。* 其实就是求解一个数右边有多少个数比它小* 解决办法 从右向左合并 遇到相等的右移右组的指针思想和前面求解小和问题一样代码如下import java.util.Scanner;public class code13_ReversePair2 { /** * 逆序对问题 用改写归并排序过程解决 * 逆序问题 左边的数如果比右边的数大,则折两个数原创 2022-01-28 17:10:09 · 921 阅读 · 0 评论 -
java求解打印所有逆序对
逆序对问题在一个数组中,左边的数如果比右边的数大,则折两个数构成一个逆序对,请打印所有逆序对暴力求解方法代码如下import java.util.Scanner;public class code12_ReversePair { /** * 逆序对问题在一个数组中, * 左边的数如果比右边的数大,则折两个数构成一个逆序对,请打印所有逆序对。 * */ public static void main(String[] args) { S原创 2022-01-28 17:07:23 · 453 阅读 · 0 评论 -
java改编归并思想求解小和问题
小和问题 用归并排序解决小和问题是在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。将小和问题转化成为求一个数右边有几个比a大就产生几个a 然后累加a即可;排序过程 a只关心右组中有几个比a大的,产生小和 左右组相等时拷贝有组 最终累加即可 左组排序过程产生的小和和右组排序过程产生的小和累加再加上merge过程产生的小和累加即可解决代码如下:package zuochengyun;import java.util.Scanner;public class code原创 2022-01-28 16:46:32 · 449 阅读 · 0 评论 -
java解决小和问题
小和问题第一种暴力解决 O(N^2)import java.util.Scanner;public class code10_SmallSum { /** * 小和问题 * 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。 * 求一个数组的小和。 * 例子:[1,3,4,2,5] 1左边比1小的数,没有;3左边比3小的数,1; 4左边比4小的数,1、3; * 2左边比2小的数,1;5左边比5小的数,1、3、4、2;所以原创 2022-01-28 15:34:21 · 569 阅读 · 0 评论 -
java实现数组的数字 归并排序(O(NlogN))
归并排序 从中点分开 先让数组的左侧排好序 再让右侧排好序 然后整体整合,左右各一个指针,如果P1小于P2指针指向的数,就把P1指的数存入一个新的数组,P1向右移动一个单位,继续和P2比较然后直到比较到左边或者右边的数组越界, 把另外一个数组剩下的加进即可import java.util.Scanner;public class code09 { /* * 归并排序 从中点分开 先让数组的左侧排好序 再让右侧排好序 * 然后整体整合 * 左右各一..原创 2022-01-28 11:59:58 · 1142 阅读 · 0 评论 -
java中用递归方法求数组的最大值
用递归方法求数组的最大值 ,二分法找最大值import java.util.Scanner;public class code08 { /* 用递归求数组中最大值问题 * */ public static int getMax(int[] arr){ return process(arr,0,arr.length-1); } public static int process(int[] arr,int L,int R){原创 2022-01-27 20:50:29 · 1278 阅读 · 0 评论 -
51Nod - 2121实现二进制转十进制 java题解
请你把一个整数n转化为二进制并从高位到低位输出。Input一行一个整数n,保证1<=n<=10^9。Output从高位到低位输出一个二进制数,表示n的二进制形式,每位之间不需要空格。Sample Input11Sample Output1011AC代码如下import java.util.Scanner;public class code07 { /* 转成二进制输出 整数取余法 * */ public static void ma原创 2022-01-27 12:40:47 · 284 阅读 · 0 评论 -
java实现插入排序
插入排序就相当于摸牌时你的从小到大排序一样 一次插入,这样的实际效率比冒泡排序和选择排序的时间复杂度低package zuochengyun;import java.util.Scanner;public class code07 { public static void main(String[] args) { /* * 插入排序 就相当于摸牌时你的从大到小排序一样 一次插入 * 最差情况是O(n的平方) 所以比选择排序和冒泡排序好原创 2022-01-26 11:55:11 · 289 阅读 · 0 评论 -
java中异或运算 两个数出现奇数次 其他数出现偶数次 求这两个数
题目描述:两种数出现奇数次 其他数出现偶数次 求这两个数解决思路两个数异或后的数a^b=eor一定不为0 找到eor数位的最右边的1,将一个数eor’把它最右边的数设为1其他为设为0 那么用eor’(就是新设置一个数只有最右边位置上的数为1)来和数组中的数相与虽然有偶数但是偶数的次数会相互抵消 只剩下a和b其中一个然后再用eor异或a或者b都可以得到另外一个。代码如下import java.util.Scanner;public class code06 { /* 题目描述原创 2022-01-24 15:18:01 · 459 阅读 · 0 评论 -
51Nod - 2151 队列复原 java题解
题目描述:小瓜现在让1到n这n个整数排成一列,但是他只告诉你每个整数的后面那个数是什么(最后一个整数的后面那个数是0),请你帮忙复原这个队列。Input第一行一个整数n(n<=100000),表示有n个整数。 接下来n行,每行两个数i,j,表示排在整数i后面的那个数是j。Outputn行,每行一个整数,表示完整的队列。Sample Input41 32 43 24 0Sample Output1324AC代码:思路:import java.util.Scanner原创 2022-01-24 13:24:18 · 815 阅读 · 0 评论 -
java中异或操作 一种数出现奇数次其他出现偶数次,求这个数
题目描述一种数出现奇数次,其他所有数出现偶数次 int[] arr 输出这个数案例如下输入 1 2 3 4 4 3 2输出 1思路用异或进行操作,因为异或两个相同的数异或的话为0,0异或N为N所以直接用0依次异或所有AC代码如下package zuochengyun;import java.util.Scanner;public class code03 { /* * 题目描述 * 一种数出现奇数次,其他所有数出现偶数次 int[] arr 输出原创 2022-01-22 16:03:11 · 456 阅读 · 0 评论 -
51nod 1591 二叉树先序遍历 java题解
题目描述:输入一个整数n(n <= 100000),表示二叉树中节点个数,编号为1~n。约定1号节点为二叉树的根节点。然后输入n行,每行包括两个整数,第i行表示编号为i的节点的左子节点和右子节点的编号。如果某个节点没有左子节点,那么对应输行的第一个整数为0;如果某个节点没有右子节点,那么对应行的第二个整数为0。先序遍历输出此二叉树每个节点的编号,每行输出一个编号。先序遍历(DLR),是二叉树遍历的一种,也叫做先根遍历、前序遍历、前序周游,可记做根左右。前序遍历首先访问根节点然后遍历左子树,最后遍原创 2022-01-22 13:29:36 · 912 阅读 · 0 评论