Algorithm and Data Structure
我对一些算法的理解
「已注销」
An ordinary person who wants to keep improving.
展开
-
在Java中,如果一个正数与其相反数进行二进制并操作,其结果的二进制是:该正数二进制最右边值为1的比特位上值是1,其它的比特位值是0
在Java中,如果一个正数与其相反数进行二进制并操作,其结果的二进制是:该正数二进制最右边值为1的比特位上值是1,其它的比特位值是0在说明这个结论之前,首先要知道,在Java中,整数数值在底层是由补码表示的。对于正数而言,它的补码就是它的原码。而对于负数而言,其补码是其相反数(正数)的反码在加1。举例:5的二进制为: 0000 1001-5的二进制为:1111 0111则5 & -5 = 5 & (~5 + 1)= 0000 0001 & (1111 0110 + 1) =原创 2021-11-07 00:53:45 · 245 阅读 · 0 评论 -
循序渐进,用Java实现红黑树
红黑树是众多“平衡的”搜索树模式中的一种,在最坏情况下,它相关操作的时间复杂度为O(log n)。1、红黑树的属性红黑树是一种二分查找树,与普通的二分查找树不同的一点是,红黑树的每个节点都有一个颜色(color)属性。该属性的值要么是红色,要么是黑色。通过限制从根到叶子的任何简单路径上的节点颜色,红黑树确保没有比任何其他路径长两倍的路径,从而使树近似平衡。假设红黑树节点的属性有键(key)、颜色(color)、左子节点(left)、右子节点(right),父节点(parent)。一棵红黑树必须满足原创 2021-09-15 00:17:07 · 165 阅读 · 0 评论 -
手把手教你用java实现二分查找树及其相关操作
二分查找树(Binary Search Tree)的基本操作有搜索、求最大值、求最小值、求前继、求后继、插入及删除。对二分查找树的进行基本操作所花费的时间与树的高度成比例。例如有n个节点的完全二叉树,对它进行的基本操作的时间复杂度为O(logn)。然而,如果树是一个有n个节点的线性的链,则在这种情况下的时间复杂度为O(n)。1、什么是二分查找树二分查找树是一种有组织的二叉树。我们可以通过链接节点表示这样一棵树。每个节点包含键(key),数据(data),左子节点(left),右子节点(right),父原创 2021-07-26 13:35:26 · 352 阅读 · 0 评论 -
Java——关于链表的一些简单操作
public class Node { int data; Node next = null; Node(int data) { this.data = data; }}import java.util.Hashtable;public class MyLinkedList { // 链表头的引用 Node head = null; /** * 在链表中加入数据,加入到链表尾 * * @p原创 2021-06-25 22:00:33 · 124 阅读 · 0 评论 -
Java通过递归实现全排列
import java.util.Arrays;/** * 全排列 */public class Permutation { /** * 对数组中坐标为[l,r]的元素进行全排列 * * @param arr * @param l * @param r */ public void permute(int[] arr, int l, int r) { if (l >= arr.length原创 2021-06-01 00:20:19 · 166 阅读 · 0 评论 -
Java堆排序降序排序
import java.util.Arrays;public class Heapsort2 { /** * 表示堆里的所有元素个数 */ private int heapLength; /** * 表示堆里未排序的个数 */ private int heapSize; /** * 堆所在的数组 */ private int[] arr; public Heapsort2(int[]原创 2021-05-21 23:38:13 · 254 阅读 · 0 评论 -
Java堆排序升序排序
import java.util.Arrays;public class Heapsort{ /** * 表示堆里的所有元素个数 */ private int heapLength; /** * 表示堆里未排序的个数 */ private int heapSize; /** * 堆所在的数组 */ private int[] arr; public Heapsort(int[] arr原创 2021-05-21 00:43:45 · 218 阅读 · 0 评论 -
Java按对角线翻转 N x N 矩阵
/** * 对N×N矩阵按对角线(左上-右下)进行翻转 */ public static void flip1(int[][] arr) { int n = arr.length; for(int i = 0; i < n -1; i++) { for(int j = i + 1; j < n; j++) { int temp = arr[i][j];原创 2021-04-21 23:06:24 · 747 阅读 · 0 评论 -
Java实现五大排序算法
1、冒泡排序里面的for循环,把当前所循环的数中的最大数,移到能表示的最后面。一次循环确当一个数。// 升序排列public static void bubbleSort(int[] arr) { boolean sorted = false; int unsortedNum = arr.length - 1; int temp = 0; ...原创 2020-04-04 23:03:54 · 189 阅读 · 0 评论 -
Java不排序求第k小元素
题目描述:输入一个整数数组,请求出该数组的第k小元素。要求时间复杂度为O(n)。输入:每组输入包括两行,第一行为一个整数数组,两个数字之间用空格隔开;第二行为k值。数组中元素个数小于10^9。输出:输出第k小元素的值。解题思路:通过快速排序中的分割方法求解。你可以通过分割是的某个数的前面的数大于等于它,后面的数小于它,或者某个数的前面的数小于等于它,后面的数大于它。由此可确定一个数在...原创 2020-04-04 21:18:01 · 663 阅读 · 0 评论 -
Java实现棋盘覆盖
题目描述:在一个n×n (n = 2的k次方)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。输入:多组测试用例,每组测试用例包括两部分,第一部分为方格的宽度n,第二部分则为方格,特殊方格为-1,其他方格为0。输...原创 2020-04-04 21:16:18 · 206 阅读 · 0 评论 -
Java实现二路归并排序
写一个程序,使用分治策略实现二路归并排序(升序)。输入:多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。输出:输出排序之后(升序)的一维整型数组,每组输出占一行。样例输入 :6 1 8 6 5 3 45 12 42 2 5 8样例输出 :1 3 4 5 6 82 5 8 12 42解决思路:这个主要是把两个有序的序列归并成一个更长的有序的序列。对于一个数组,先把...原创 2020-04-04 21:13:06 · 517 阅读 · 2 评论 -
Java实现随机化快速排序
题目描述:使用Java或C++等语言中内置的随机函数实现随机化快速排序,在数组中随机选择一个元素作为分区的主元(Pivot)。输入:多组样例输入,每组由一个一维整型数组组成。输出:随机化快速排序之后的一维整型数组(升序排列)。样例输入 :6 1 8 6 5 3 45 12 42 2 5 8样例输出 :1 3 4 5 6 82 5 8 12 42解决思路:这主要是对一个排列a...原创 2020-04-04 21:09:14 · 478 阅读 · 0 评论 -
C语言解决整数划分问题
根据整数划分的规律,可以得出下面公式递归公式:q(n, m) 表示对整数n进行划分,最大数不超过m的划分个数。同时,本人在做算法题时,遇到一个类似整数划分的问题,及:对整数n进行划分,其划分的数的个数不超过m个,求其划分个数。设解决这个问题的方法为p(n, m)。在求解过程中,我发现:对整数n进行划分,最大数不超过m的划分个数=:对整数n进行划分,其划分的数的个数不超过m个,求其划分个数。...原创 2020-04-04 18:15:37 · 762 阅读 · 0 评论 -
C语言通过递归实现全排列
什么是全排列:假设有n个元素,我用这n个元素按一定顺序排列得到的序列,这个序列,就是这n个元素的一个全排列。要解决的问题:求出n个元素的所有全排列解决思路:对于第一个元素,先从n个元素中轮流选出一个当一个元素,对于第二个元素,从n-1个元素中轮流选出一个当二个元素,以此类推,直到最后一个元素。由此可知,对于n个各不相同的元素,它的全排列有n!个。代码:#include <stdio....原创 2020-04-04 17:45:17 · 4047 阅读 · 0 评论 -
C语言解决三根柱子的汉诺塔问题
问题:有柱子A、B、C, 有n个圆盘解题思路:先把n-1个圆盘通过C,从A移到B,在把第n个圆盘移到C,然后在通过C,把n-2个圆盘移到A,再把第n-1个圆盘移到C,以此进行下去代码:#include <stdio.h>int step;void move(int n, char a, char b) {printf("%d: move %d from %c to %c.\...原创 2020-04-04 17:42:15 · 2314 阅读 · 0 评论 -
Java实现矩阵转置
//矩阵转置class ArrayUtil { //输入矩阵和其列大小 public static int[][] transpose(int[][] arr, int column) { int[][] arr2 = new int[column][arr.length]; for (int i = 0; i < arr.length; i++) { int k = 0...原创 2019-07-28 20:50:06 · 4358 阅读 · 0 评论 -
java求解猴子分桃问题
问题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份。第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子,此时第五只猴子得到多少桃子。解题思路:由于这个问题没有具体的数值,只告诉了我们一些数值间的关系。所以,我们可以根据这些...原创 2019-07-28 19:50:02 · 583 阅读 · 0 评论