查找与排序
甘甘甘甘甘甘甘
码不停题
展开
-
题解|在有空字符串的有序字符串数组中查找
在有空字符串的有序字符串数组中查找在有空字符串的有序字符串数组中查找某一字符串给定条件,在字符串数组{“a”,"",“ac”,"",“ad”,“b”,"",“ba”}中查找b的索引思路因为字符串数组是有序的,所以尝试采用二分查找。在二分查找过程中,中值有可能是空字符串,所以要对这原创 2019-01-15 11:55:10 · 485 阅读 · 0 评论 -
题解|需要排序的子数组长度(锯齿形数组)
需要排序的子数组题目描述给定一个无序数组arr,求出需要排序的最短子数组长度如输入:arr = {2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序思路确定数组最大值位置,从该位置向右扫描寻找是否有小于最大值的元素,若有则扩大需要排序区间的右端。确定数组最小值位置,从该位置向左扫描寻找是否有大于最小值的元素,若有则扩大需要排序区间的左端。得出左右端点即可计算长度...原创 2019-01-29 15:48:06 · 655 阅读 · 3 评论 -
题解|排序数组中寻找和的因子
排序数组中寻找和的因子题目描述给定已排序数组arr和k,不重复打印arr中所有相加和为k的不降序二元组如输入arr={-8,-4,-3,0,2,4,5,8,9,10};k=10;输出(0,10)(2,8)思路1:遍历数组每个元素,用二分查找寻找k-arr[i]思路2:双指针逼近法下面提供思路2的源代码public class 排序数组中找和的因子_02 { public s...原创 2019-01-29 14:51:40 · 369 阅读 · 0 评论 -
基数排序
基数排序import java.util.ArrayList;/* * 桶排序的变种 * 下列的桶排序不包含排序负数的功能 * 根据数组中最大数字的位数K进行K次的入桶和分配操作 */public class RadixSort { public static void main(String[] args) { // TODO Auto-generated method ...原创 2019-01-26 16:03:30 · 152 阅读 · 0 评论 -
计数排序
计数排序思路元素转下标下标转元素下面的源代码不包含对非负数排序的功能/* * 非常快,但是有可能浪费大量空间 */public class 计数排序 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 0, 16, 4, 10, 14,...原创 2019-01-25 20:20:32 · 109 阅读 · 0 评论 -
堆排序|以小顶堆实现升序排序
以小顶堆实现升序排序思路堆化创建辅助空间,并将原数组拷贝给辅助空间在辅助空间上,将根节点元素与数组最后一个元素位置交换,在原数组上记录此时的最后一个元素。在辅助空间上调整数组,但规模(n)减1。如此循环直到n=3// 升序堆排序 public static void minHeapUpSort(int[] arr, int i, int n) { makeMinHeap(a...原创 2019-01-25 19:40:24 · 603 阅读 · 0 评论 -
堆排序|minHeapFixDown的递归和迭代形式
minHeapFixDown的递归和迭代形式// 把以i为根节点的二叉堆调整成小顶堆 public static void minHeapFixDown(int[] arr, int i, int n) { // 找到左右孩子 int left = 2 * i + 1; int right = 2 * i + 1; // 找到左右孩子中的最小孩子 // 左孩子越界,右孩子必...原创 2019-01-25 00:14:44 · 683 阅读 · 0 评论 -
一题三解|最小可用ID
最小可用ID描述在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000。例如(3,2,1,5,8,6)中,最小可用ID为4。解法1将乱序数组排序之后,对数组中的数字进行位置确认。即第x个数字要在x - 1的索引上。复杂度O(nlgn)private static int f(int[] arr) { Arrays.sort(arr); int res ...原创 2019-01-22 14:59:37 · 477 阅读 · 1 评论 -
题解|超过数组长度一半的数字
超过数组长度一半的数字描述数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字。思路排序后返回arr[arr.length/2]。排序后扫描。超过数组长度一半的数字,其次数累加和一定大于其余数字的累加和。所以可以直接遍历数组,保存当前数字和出现次数,相同数字count++否则count- -,若count = 0则重置当前数字和出现次数。遍历完成后,返回保存的数字。pu...原创 2019-01-22 11:29:43 · 209 阅读 · 0 评论 -
归并排序|递归与非递归形式
归并排序取中间值,将数组分为左右两部分。对左右两部分,分别进行排序。借助辅助数组,合并两部分。public class MegerSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 11, 2, 5, 8, 7, 6, 3, 9 };...原创 2019-01-21 20:37:17 · 133 阅读 · 0 评论 -
题解|奇数在左偶数在右之快排的双指针思想
奇数在左偶数在右思路:快排的双指针思想public class 奇数在左偶数在右 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 2, 3, 6, 8, 1, 12, 10, 7, 5, 4, 9 }; f(arr); for (int n...原创 2019-01-20 15:13:09 · 285 阅读 · 0 评论 -
题解|高效率求出乱序数组中的第k小元素
高效率求出乱序数组中的第k小元素public class 最快效率求出乱序数组中的第k小元素 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 4, 3215, 1, 54, 9, 3 }; System.out.println(f(a...原创 2019-01-20 15:09:26 · 340 阅读 · 0 评论 -
一题三解|TwoSum
TwoSum描述给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要输出这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。你可以假设数组递增有序。输入第一行:N个整数,作为数组的元素,空格分开第二行:target输出两个下标,空格隔开。如有多组满足要求,输出靠前的一组。样例输入42 7 11 159样例输出0...原创 2019-01-19 20:04:02 · 208 阅读 · 0 评论 -
题解|旋转数组中的二分查找
题解|旋转数组中的二分查找描述输入一个递增排序的数组(元素不重复)的一个旋转(次数不详),找出某个元素.输入第一行:N,数组的长度第二行:N个整数,作为数组的元素,空格分开第三行:要查找的关键字K输出关键字K的下标,如果没有找到,输出-1样例输入56 1 2 3 41样例输出1思路O(n)的算法不写了,下面是O(lgn)的。在旋转数组中先找到最小的一个元素位置...原创 2019-01-19 17:25:58 · 543 阅读 · 0 评论 -
快排之双向扫描分区
快排之双向扫描分区public class 快排之双向扫描分区 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 }; quickSort(arr, 0, arr.len...原创 2019-01-18 12:18:57 · 339 阅读 · 2 评论 -
快排之三指针扫描分区
快排之三指针扫描分区适用于选取主元时,所选主元在数组中有多个相同值。若数组中没有主元的相同值,没有必要用三指针扫描分区法。下面主要分析的是partition部分的方法:三个指针:less(指向第一个等于主元的位置);sc(向右移动的扫描指针,指针左侧皆小于等于主元);bigger(指针右侧皆大于主元)在分区时有三个阶段:阶段1:sp指针一直向右移,当扫描到小于主元的值时sc++,当...原创 2019-01-18 12:10:18 · 900 阅读 · 4 评论 -
快排之单向扫描分区法
快排之单向扫描分区法public class 快排之单向扫描分区 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 }; quickSort(arr, 0, arr.le...原创 2019-01-17 19:19:07 · 751 阅读 · 4 评论 -
题解|最长连续递增子序列
最长连续递增子序列给定一个未经排序的整数数组,找到最长且连续的的递增序列。示例 1:输入: [1,3,5,4,7]输出: 3解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。示例 2:输入: [2,2,2,2,2]输出: 1解释: 最长连续递增序列是 [2], 长度为1。...原创 2019-01-15 18:47:46 · 1155 阅读 · 0 评论 -
特殊排序|自定义比较规则
特殊排序题目描述设计一个函数打印出整型数组全部数字的最小组合数。例如数组{3,32,321},打印这3个数字的最小组合数,321323基于冒泡排序的自定义比较规则源代码import java.util.Scanner;public class 特殊排序 { /* * 输入数组{3,32,321},打印这3个数字的最小组合数,321323 */ public static ...原创 2019-01-30 22:37:54 · 235 阅读 · 0 评论