算法小结
qishun2xiao
之前一直没有发什么博客,总感觉少了点什么,现在把以前学习的一些干货拿出来晒一晒(一直用的映像笔记,感觉非常不错,这些也是之前自己保存的,有些是网上参考的,大部分是自己的一些总结、感悟)~~~~~
展开
-
小范围排序(巧用堆排序) -- 算法小结
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。测试样例: [2,1,4,3,6,5,8,7,10,9],10,2 返回:[1,2,3,4,5,6,7,8,9,10] 编程思路:由于知道了使每个元素有序原创 2017-09-13 11:27:07 · 285 阅读 · 0 评论 -
有序矩阵查找 -- 算法小结
现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x。给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x。所有矩阵中数字及x均为int范围内整数。保证n和m均小于等于1000。测试样例: [[1,2,3],[4,5,6],[7,8,9]],3,3,10 返回:falseimport java.util.*;publ原创 2017-09-21 17:49:22 · 1151 阅读 · 0 评论 -
可查询最值的栈 -- 算法小结
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。import java.util.Stack;public class Solution { Stack<Integer> sta = new Stack<Integer>(); Stack<Integer> min = new Stack<Integer>(); public void push(int原创 2017-10-08 21:53:23 · 246 阅读 · 0 评论 -
三色排序 -- 算法小结
题目描述:有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。测试样例: [0,1,1,0,2,2],6 返回:[0,0,1,1,2,2]import java.util.*;public class ThreeColor { public int[] sor原创 2017-09-21 16:53:48 · 457 阅读 · 0 评论 -
最短子数组练习题 -- 算法小结
对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。测试样例: [1,4,6,5,9,10],6 返回:2 编程思路:找出需要排序的最小子数组,只需要找到需要移动位置的离两边位置最近的元素即可,我们知道离最左边需要移动元素就是第一个比前原创 2017-09-29 22:18:30 · 236 阅读 · 0 评论 -
句子的逆序 -- 算法小结
对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。给定一个原字符串A和他的长度,请返回逆序后的字符串。测试样例: “dog loves pig”,13 返回:”pig loves dog”编程思路:由于是对每个单词进行逆序 所以只需改进一下字符串逆序的方法(进行两次逆序,第一次在每个单词内部,第二次在整个字符串之间)原创 2017-10-08 19:14:09 · 421 阅读 · 0 评论 -
词语变形 -- 算法小结
对于两个字符串A和B,如果A和B中出现的字符种类相同且每种字符出现的次数相同,则A和B互为变形词,请设计一个高效算法,检查两给定串是否互为变形词。给定两个字符串A和B及他们的长度,请返回一个bool值,代表他们是否互为变形词。测试样例: “abc”,3,”bca”,3 返回:true编程思路:由于只需要比较两个字符串中出现的 字符次数是否相同,我们只需要为每个字符设置一个标志(初始为0),每次A原创 2017-10-08 18:25:04 · 339 阅读 · 0 评论 -
堆排序 -- 算法小结
对于一个int数组,请编写一个堆排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 思路:首先以整个数组建一个大根堆,然后将根与最后一个结点交换,最后一个即有序,接着大根堆的大小-1,重新建立大根堆,重复上述过程 直至堆大小为1…..import java.util.*;public cla原创 2017-09-10 12:37:32 · 184 阅读 · 0 评论 -
冒泡排序 -- 算法小结
虽然很早之前已经写过冒泡排序的实现,不过还是再发一遍吧 。。。。 对于一个int数组,请编写一个冒泡排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 解题思路:交换排序的方法 每次比较相邻的两个数import java.util.*;public class BubbleSort {原创 2017-09-07 18:28:21 · 248 阅读 · 0 评论 -
选择排序 -- 算法小结
对于一个int数组,请编写一个选择排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 解题思路:选择排序的使用就不再赘述了 这里需要注意一点 再进行 A[tem]=A[i]时得先判断开始的位置是否就是最小值 若是 则不执行 import java.util.*;public cl原创 2017-09-07 18:59:56 · 271 阅读 · 0 评论 -
插入排序 -- 算法小结
对于一个int数组,请编写一个插入排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5]import java.util.*;public class InsertionSort { public int[] insertionSort(int[] A, int n) { /原创 2017-09-08 11:05:38 · 177 阅读 · 0 评论 -
归并排序 -- 算法小结
对于一个int数组,请编写一个归并排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5]import java.util.*;public class MergeSort { public int[] mergeSort(int[] A, int n) { // write原创 2017-09-08 11:37:45 · 259 阅读 · 0 评论 -
快速排序 -- 算法小结
对于一个int数组,请编写一个快速排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 解题思路 :运用递归的思想 每次将传入数组的最后一个元素作为基准值,先将小于它的数全部移(交换)到数组的前面,最后将它放到中间,对两边进行同样的操作。。。import java.util.*;public原创 2017-09-08 15:02:49 · 239 阅读 · 0 评论 -
希尔排序 -- 算法小结
对于一个int数组,请编写一个希尔排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。保证元素小于等于2000。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 解题思路 : 依次缩小步长直至步长为1import java.util.*;public class ShellSort { public int[] shellSort(i原创 2017-09-08 15:21:37 · 256 阅读 · 0 评论 -
计数排序 -- 算法小结
对于一个int数组,请编写一个计数排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5]import java.util.*;public class CountingSort { public int[] countingSort(int[] A, int n) { //原创 2017-09-08 15:58:37 · 187 阅读 · 0 评论 -
基数排序 -- 算法小结
对于一个int数组,请编写一个基数排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。保证元素均小于等于2000。测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5]import java.util.*;public class RadixSort { public int[] radixSort(int[] A, int n) {原创 2017-09-08 16:04:27 · 201 阅读 · 0 评论 -
有序数组合并 -- 算法小结
有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。请编写一个方法,将B合并入A并排序。给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组。 编程思路:根据题意 我们可以从后往前依次比较两个数组尾部(此时指A 的m位置)元素的大小 取大者存于A(此时是m+n)中最终有序数组尾部相应位置 直至B中元素完全加入A原创 2017-09-13 13:48:47 · 325 阅读 · 0 评论 -
重复值判断(堆排序的非递归使用) -- 算法小结
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。给定一个int数组A及它的大小n,请返回它是否有重复值。测试样例: [1,2,3,4,5,5,6],7 返回:true编程思路:我们知道堆排序在空间复杂度要求为1的时候效率是最好的 但是如果使用递归的话 由于函数栈的使用 空间复杂度变成了O(logN) 因此需要设计一个非递归的堆排序import java.uti原创 2017-09-13 13:16:15 · 1975 阅读 · 0 评论 -
相邻两数最大差值 -- 算法小结
有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。测试样例: [1,2,5,4,6],5 返回:2编程思路:本题明显就是先排序,后比较相邻数的差值,因此有很多的实现方法,首先就是排序,我们可以选择复杂度较低的算法,这里使用类似桶排序的思想,我们不是以元素的值来计算桶的数目,而是元素个数来划分原创 2017-10-05 17:10:58 · 3493 阅读 · 0 评论