算法
主要是题型和算法思维
Tin know
这个作者很懒,什么都没留下…
展开
-
字符串之KMP匹配
字符串KMP匹配①暴力匹配法②next数组③求next数组//暴力法static int indexOf(String s1,String s2){ int i = 0; int l = i; int j = 0; while(i < s1.Length()){ if(s1.charAt(l) == s2.charAt(j)){ l++; j++; ...原创 2020-04-06 18:33:52 · 163 阅读 · 0 评论 -
字符串匹配之RabinKarp的奇妙
字符串匹配之RabinKarp说起字符串我们首先想到的就是一个字符一个字符的匹配,失配那么就重新来过//暴力法static int indexOf(String s1,String s2){ int i = 0; int l = i; int j = 0; while(i < s1.Length()){ if(s1.charAt(l) == s2.charAt(j)){...原创 2020-04-06 17:15:00 · 207 阅读 · 0 评论 -
一个正整数如果任何一个数位不大于右边相邻的数位, * 则称为一个数位递增的数,例如1135是一个数位递增的数, * 而1024不是一个数位递增的数。
【问题描述】一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?【输入格式】输入的第一行包含一个整数 n。【输出格式】输出一行包含一个整数,表示答案。【样例输入】30【样例输出】26【评测用例规模与约定】对于 40% 的评测...原创 2020-04-06 12:50:06 · 3334 阅读 · 0 评论 -
给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。
最大子矩阵时间限制:10000ms单点时限:1000ms内存限制:256MB描述给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。输入第一行包含三个整数N、M和K。以下N行每行包含M个整数,表示A。对于40%的数据,1 <= N, M <= 10对于100%的数据,1 <= N, M ...原创 2020-03-26 18:18:04 · 1992 阅读 · 0 评论 -
"有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
描述有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。注意:不要使用缓存矩阵输入第一行包含一个整数N。(1\u003C=N\u003C=500)随后的N行每一行都有N个整数(空格隔...原创 2020-03-24 20:46:50 · 297 阅读 · 0 评论 -
矩阵运算
矩阵运算1、矩阵相加注意:两个矩阵行的个数列的个数必须是一样的才可以相加也就是矩阵中所有的元素相加A + B一个位置对一个位置加public int[][] arrAdd(int[][] A,int[][] B){ for(int i = 0;i < A.length;i++){ for(int j = 0;j < B.length;j++){ A[i][j]...原创 2020-03-24 19:54:53 · 3245 阅读 · 0 评论 -
冒泡、选择、插排、希尔、归并、快速、堆排、计数、基数、桶排可视化算法
一、基于比较排序冒泡排序 O(N^2)相邻的比较 将大的冒到最后选择排序 O(N^2)找到最小放在前面选择排序 O(N^2)让一部分有序,再遇到更小的插入希尔排序 O(N logN)间隔比较 依次插入快速排序 O(N logN) 找到一个中间值让左边小于等于主元,左边大于主元 重点在于分治堆排序 O(N logN) 转换成大堆或者小堆 主根一定比...原创 2020-03-10 20:12:01 · 375 阅读 · 0 评论 -
堆排序
在了解堆排序之前巩固一下,前中后 序遍历一、前序遍历原创 2020-03-09 13:22:00 · 290 阅读 · 0 评论 -
归并排序
归并分解子问题就是随意的在中间划一刀,不管左右大小分成两个子数组子数组中小的先走,大的留下利用递归合并的方式先将左右两边得数组排序依次扩展数据样例代码static void MergeSort(int[] arr,int begin,int end){ if(begin<end){ int indexMid = (begin+end)>>1; MergeS...原创 2020-03-03 17:13:12 · 146 阅读 · 0 评论 -
最小可用ID
描述在非负数(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000;输入第一行 数组长度第二行 数组元素输出整数样例输入53 2 1 4 5 7 8 9样例输出6解题思路首先分析题干在乱序数组中寻找那个空缺的数解法一:暴力循环O(N^2)static int f(int[] arr){ int i=1; while(i<arr....原创 2020-03-03 15:53:23 · 281 阅读 · 0 评论 -
寻找发帖水王
描述Tango 是微软亚洲研究院的的一个实验项目。研究院的员工和实习生们都很喜欢在Tango上交流灌水,传说,Tango,有一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该"水王”发帖数目超过了帖子总数的一-半。如果你有一ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子总数的一-半.如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速...原创 2020-03-02 21:37:37 · 204 阅读 · 0 评论 -
寻找无序数组中个数超过一半的那个数
描述数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。输入第一行 数组长度第二行 数组元素输出整数实例输入51 2 3 4 4 4 4实例输出4解题思路解法一:排序,输出数组一半的值public static void main(String[] args){ Scanner sc = new Scanner(System.in); int...原创 2020-03-02 21:05:06 · 367 阅读 · 0 评论 -
数组中的第k小数
描述以尽量高效率求出乱序中的k小数输入第一行 数组长度第二行 数组元素 空格隔开第三性 第几小的数输出第k小的数样例输入56 1 2 9 3 82样例输出2解题思路利用快速排序找到主元的位置,判断主元是第几小的主元位置大了剪掉右边的主元位置小了剪掉左边的假设要找第三小的数主元的位置比最要找数大时剪掉右边的主元的位置比要找的数小时剪掉左边的代码示...原创 2020-03-02 19:50:45 · 352 阅读 · 0 评论 -
调整数组顺序使奇数位与偶数前面
描述调整数组顺序使奇数位与偶数前面:输入一个整型数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分,要求时间复杂度O(N)解题思路遇到奇数不管,遇到偶数交换//O(N)static void f(int[] arr) { int Scan = 0; int os = arr.length-1; while(Scan<=os) {...原创 2020-03-02 18:58:52 · 601 阅读 · 1 评论 -
快速排序扫描分区法
一、快速排序单向扫描分区法static void quickSort(int[] arr,int begin,int end) {//分成若干个左子问题,右子问题 if(begin<end) { int q = partition(arr,begin,end); quickSort(arr, begin, q-1); quickSort(arr, q+1, end)...原创 2020-02-29 17:28:25 · 425 阅读 · 2 评论 -
快速排序双向扫描分区法
先参考:https://blog.csdn.net/Tinknow324/article/details/104559457先参考一遍分区法和一遍分区法是一样的,定义主元,左右指针1.左指针的值小于等于主元那么就一直往右走,最后一次一定是大于主元的2.右指针的值大于主元那么就一直往左走,最后一次肯定是小于主元的3.把他们两个的值交换,4.注意:一定是先左再右代码实现主要是更改pa...原创 2020-02-28 17:59:28 · 362 阅读 · 0 评论 -
快速排序之单向分区法
快速排序在许多竞赛,面试中经常考一个项目,常以填空,算法形式出现static void quickSort(int[] arr,int begin,int end) {//分成若干个左子问题,右子问题 if(begin<end) { int q = partition(arr,begin,end); quickSort(arr, begin, q-1); quick...原创 2020-02-28 17:24:24 · 432 阅读 · 0 评论 -
输入一个递增排序的数组(元素不重复)的一个旋转(次数不详),找出某个元素.
输入一个递增排序的数组(元素不重复)的一个旋转(次数不详),找出某个元素.描述输入一个递增排序的数组(元素不重复)的一个旋转(次数不详),找出某个元素.输入第一行:N,数组的长度第二行:N个整数,作为数组的元素,空格分开第三行:要查找的关键字K输出关键字K的下标,如果没有找到,输出-1样例输入56 1 2 3 41样例输出1...原创 2020-02-28 12:54:56 · 415 阅读 · 0 评论 -
输入一个递增排序的数组(元素不重复)的一个旋转,找其中最小的数
描述输入一个递增排序的数组(元素不重复)的一个旋转,找其中最小的数输入第一行:N,数组的长度第二行:N个整数,作为数组的元素,空格分开第三行:要查找的关键字K输出关键字K的下标,如果没有找到,输出-1样例输入56 1 2 3 41样例输出1...原创 2020-02-28 12:51:33 · 423 阅读 · 0 评论 -
给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。输出这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。你可以假设数组递增有序,O(N)时间完成
描述给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要输出这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。你可以假设数组递增有序。请在O(N)时间内完成。输入第一行:N个整数,作为数组的元素,空格分开第二行:target输出两个下标,空格隔开。如有多组满足要求,输出靠前的一组。样例输入42 7 11 159...原创 2020-02-28 11:55:58 · 2623 阅读 · 5 评论 -
位运算解决“加,减,乘,除”
用位运算解决两个加,减,乘,除位运算符与//11 为 1 | 10 为 0 | 01 为 01001 & 1000 = 1000或//11 为 1 | 10 为 1 | 01 为 11111 | 1000 = 1111非//取反 1000 = 0111~1000 = 0111异或//相同为0 不同为11000 ^ 1000 = 0000...原创 2020-02-27 21:09:40 · 594 阅读 · 0 评论